2015-12-30 3 views
0

У меня есть класс LoginTask, который является подклассом AsyncTask. Я использовал это для выполнения функций входа в систему. Просто мой LoginTask выглядит следующим образомКак вызвать onPostExecute только после завершения CallBack Методы doInBackground

class LoginTask extends AsyncTask<JsonObject,Void,String>{ 
    @Override 
    protected void onPreExecute() { 
     //Codes to show progressDialog 
    } 
    @Override 
    protected String doInBackground(JsonObject... params) { 

    Ion.with(MainActivity.this) 
       .load("--URL TO POST JSON DATA--") 
       .setJsonObjectBody(params[0]) 
       .asJsonObject() 
       .withResponse() 
       .setCallback(new FutureCallback<Response<JsonObject>>() { 
        @Override 
        public void onCompleted(Exception e, Response<JsonObject> result) { 

         if (result != null) { 
          if (result.getHeaders().code() == 200) { 

           Toast.makeText(MainActivity.this, "Login Success", Toast.LENGTH_SHORT).show(); 

          } else if (result.getHeaders().code() == 401) { 
           Toast.makeText(MainActivity.this, "Invalid Username or password", Toast.LENGTH_LONG).show(); 

          } else { 
           Toast.makeText(MainActivity.this, "Something wrong check connection !!!", Toast.LENGTH_SHORT).show(); 
          } 
         } 
        } 
       }); 

     return "some message"; 

    } 

    @Override 
    protected void onPostExecute(String string) { 
     super.onPostExecute(string); 

     if(progressDialog.isShowing()){ 

      progressDialog.dismiss(); 

      //TODO Something 

     } 

    } 
} 

То, что я хочу, и что было случилось:

  • Я хочу назвать onPostExecute только после получения результата от FutureCallback метода Но когда я отладки приложения Он прямо возвращает значение и onPostExecute Метод, называемый Непосредственно перед FutureCallback.
  • Я написал код для выполнения LoginTask при входе Кнопка нажимается событий, я хочу, чтобы показать ProgressDialog каждый раз, когда нажимается кнопка, но проблема ProgressDialog показан только в первый раз, он не сделал появляются, когда я нажал кнопку второй раз.
  • Я хочу установить какое-то сообщение переменной и вернуть ее к методу onPostExecute, чтобы я мог обрабатывать конкретные задачи на основе значения параметра String. Но FutureCallback вызывается только после выполнения всей задачи.

Любые предложения будут оценены.

+1

попробовать без 'AsyncTask' и делать все, что в' onCompleted' –

+0

@kishorejethava Оо Мне жаль спасибо за ваше предложение ... –

ответ

2

Здесь вы вызываете другую нить внутри асинхронной. Так что происходит, когда вызывается новый поток. Asynctask не ждет завершения потока вашего иона, поэтому он будет включен в onPostExecute.

Я думаю, что здесь вам не нужна асинхронизация, потому что Ion уже делает запрос асинхронно. Что бы вы ни делали внутри onPostExecute(), вы можете поместить это внутри onComplete() вызова иона.

+0

Спасибо .. Я хотел, чтобы выполнить его внутри asynctask, потому что было много скрытых кодов перед вызовом ION +1 для вашего ответа .... –

1

Делай так,

[Codes to show progressDialog] 

Ion.with(MainActivity.this) 
      .load("--URL TO POST JSON DATA--") 
      .setJsonObjectBody(params[0]) 
      .asJsonObject() 
      .withResponse() 
      .setCallback(new FutureCallback<Response<JsonObject>>() 
{ 
       @Override 
       public void onCompleted(Exception e, Response<JsonObject> result) { 
if(progressDialog.isShowing()){ 

     progressDialog.dismiss(); 

     //TODO Something 

    } 
        if (result != null) { 
         if (result.getHeaders().code() == 200) { 

          Toast.makeText(MainActivity.this, "Login Success", Toast.LENGTH_SHORT).show(); 

         } else if (result.getHeaders().code() == 401) { 
          Toast.makeText(MainActivity.this, "Invalid Username or password", Toast.LENGTH_LONG).show(); 

         } else { 
          Toast.makeText(MainActivity.this, "Something wrong check connection !!!", Toast.LENGTH_SHORT).show(); 
         } 
        } 
       } 
      }); 
+0

Спасибо за ваше предложение help .. Но он уже решен первым ответом +1 для предложения ur. –

1

onCompleted() метод вы передаете в setCallback() методом является метод обратного вызова, который представляет собой асинхронный вызов, так этот обратный вызов будет вызван, когда возвращается ответ с сервера и его требуется время, которое почему ваш метод onPostExecute вызывается до futureTask.

Ion lib уже использует асинхронные вызовы, поэтому вам не нужно использовать AsyncTask. Вам просто нужно сделать следующее:

Ion.with(MainActivity.this) 
      .load("--URL TO POST JSON DATA--") 
      .setJsonObjectBody(params[0]) 
      .asJsonObject() 
      .withResponse() 
      .setCallback(new FutureCallback<Response<JsonObject>>() { 
       @Override 
       public void onCompleted(Exception e, Response<JsonObject> result) { 

        if (result != null) { 
         if (result.getHeaders().code() == 200) { 

          Toast.makeText(MainActivity.this, "Login Success", Toast.LENGTH_SHORT).show(); 

         } else if (result.getHeaders().code() == 401) { 
          Toast.makeText(MainActivity.this, "Invalid Username or password", Toast.LENGTH_LONG).show(); 

         } else { 
          Toast.makeText(MainActivity.this, "Something wrong check connection !!!", Toast.LENGTH_SHORT).show(); 
         } 
        } 
       } 
      }); 
+0

Спасибо за ваш ответ .. Но он решен уже Первым ... –

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