2013-08-23 1 views
2

Я только что получил развитие android, и при попытке создать форму входа я столкнулся с некоторыми проблемами.onPostExecute не запускается, @override doesnt работает разработка Android

Что я хочу сделать, это ввести имя пользователя и пароль и нажать логин, когда нажата кнопка входа в систему. Я хочу, чтобы он выполнял запрос JSON с информацией учетной записи на мой сервер и получал ответ от того, является ли пользователь разрешено войти. Если пользователь разрешен, я хочу перейти на новое представление.

Мой код правильно принимает информацию JSON, но из того, что я понял, UI-код (нажатие нового действия) должен выполняться в onPostExecute(). Моя проблема в том, что onPostExecute никогда не запускается, я смотрел на другой ppl с той же проблемой, но их решения не сработали для меня. Они сказали, что мне нужно иметь @Override перед onPostExecute, но когда я добавляю, что получаю ошибку компиляции, которая «метод не отменяет метод из своего суперкласса».

Я читал решения от людей, имеющих эту проблему, а также из того, что я прочитал, проблема заключается в том, что метод onPostExecute должен иметь те же параметры, что и параметр result из doInBackground(). Моя проблема в том, что я чувствую, что я уже делаю, и когда я пытаюсь смотреть в том, что у суперкласса есть (то есть AsyncTask.java) он говорит, что метод onPostExecute() выглядит следующим образом:

protected void onPostExecute(Result result) { 
    } 

Но у меня нет идея, что класс Результат принадлежит ..

networkingTask выполняется с помощью этой строки:

new networkingTask().execute(url); 

Если кто-то может мне помочь я буду вечно благодарен! :)

Это то, что мой код выглядит

private class networkingTask extends AsyncTask { 
    Context context; 
    private networkingTask(Context context) { 
     this.context = context.getApplicationContext(); 
    } 

    public networkingTask() { 
    } 

    @Override 
    protected JSONObject doInBackground(Object... params) { 
     try { 

      String urlString = (String) params[0]; 
      System.out.println(urlString); 
      // Creating JSON Parser instance 
      JSONParser jParser = new JSONParser(); 
      // getting JSON string from URL 
      JSONObject json; 
      json = jParser.getJSONFromUrl(urlString); 

      String responseLogged = json.getString("logged"); 
      System.out.println("can we log in?: "+ responseLogged); 

      return json; 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
      return null; 
    } 

    @Override 
    protected void onPostExecute(JSONObject result) { 
     String responseLogged = ""; 
     try { 
      responseLogged = result.getString("logged"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     if(responseLogged.equals("true")){ //Login = true 
      Intent intent = new Intent(context, ShowListActivity.class); 
      intent.putExtra(EXTRA_JSON_OBJECT, result.toString()); 
      startActivity(intent); 
     } else{ //Login = false 
      System.out.println("wrong password"); 
     } 

     return; 
    } 

} 

ответ

8

В вашей линии:

private class networkingTask extends AsyncTask 

просто изменить его на:

private class networkingTask extends AsyncTask<String, Void, JSONObject> 

в то время как String это место для вас, чтобы передать в параметрах, в вашем случае это url, второй параметр Void предназначен для отображения прогресса, а последний - обработанный результат, который должен быть принят от doInBackground до onPostExecute

Для получения дополнительной информации объяснения &, пожалуйста, обратитесь к Android Developers: AsyncTask

+0

Все еще есть проблемы в моем коде, но по крайней мере onPostExecute() работает! Большое спасибо <3 – Daniel

+0

@ Даниэль, я рад узнать, что это помогает. : D – dumbfingers

1

Подпись не совпадает. Вы пытаетесь переопределить:

protected void onPostExecute(Result result) 

с подписью

protected void onPostExecute(JSONObject result) 

... который не существует в суперкласса.

3

Я думаю, что вам может понадобиться заполнить общие типы для AsyncTask.See the "Usage" section in the AsyncTask documentation.

Вашего класс подпись должна выглядеть следующим образом:

private class networkingTask extends AsyncTask<Object, Void, JSONObject> 

Типы в скобках здесь соответствует типам аргументов для doInBackground, onProgressUpdate и onPostExecute, соответственно, и необходимы, если вы собираетесь чтобы переопределить эти методы таким образом, чтобы они отличались от сигнатур обобщенного метода.

Кроме того, в качестве основного примечания в Java/Android принято использовать upper CamelCase, чтобы начать имя класса. Я также изменил бы название своего класса на «NetworkingTask», чтобы помочь другим разработчикам взглянуть на ваш код, чтобы лучше понять его.

Смежные вопросы