2015-12-30 88 views
0

我有一个类LoginTask它是AsyncTask的子类。我用它来执行登录功能。只要我LoginTask看起来像这样如何仅在完成回调函数的CallBack方法后调用onPostExecute

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 

     } 

    } 
} 

我想要的,什么是事情发生了:

  • 我想只有从FutureCallback方法得到结果之后调用onPostExecute但是当我调试应用程序它是直接返回值和onPostExecute方法之前立即调用FutureCallback方法。
  • 我已经写代码来执行LoginTask在登录按钮按下事件,我想显示ProgressDialog每次当按下按钮时,但问题是ProgressDialog仅在第一次显示,它没有第二次按下按钮时出现。
  • 我想设置一些消息给一个变量,并返回到onPostExecute方法,以便我可以根据String参数的值处理特定的任务,但是FutureCallback仅在执行完整个Task后才会调用。

任何类型的建议将不胜感激。

+1

尝试没有'AsyncTask',做任何在'onCompleted' –

+0

@kishorejethava喔,我的建议对不起谢谢... –

回答

2

这里你调用asynctask中的另一个线程。所以发生什么事是新线程被调用的时候。 Asynctask并不等待你的离子线程完成,所以它会onPostExecute。

我认为你不需要一个asynctask在这里,因为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

感谢您的帮助建议..但它已经通过第一个回答+1来解决你的建议。 –

1

onCompleted()方法,则需要通过在setCallback()方法是一个异步调用,所以当响应从服务器返回这个回调将被调用的回调方法,它需要一定的时间即为什么在futureTask之前调用onPostExecute方法。

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

感谢您的回答..但它已经由First ...解决了... –

相关问题