如何在完成doInBackground

时间:2015-12-30 06:38:34

标签: android android-asynctask callback

我有一个 LoginTask 类,它是AsyncTask的子类。我用它来执行登录功能。我的 LoginTask 就像这样

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方法,在{{1}之前立即调用方法。
  • 我已经在按下Login按钮时编写了执行 LoginTask 的代码事件,我想在每次按下按钮时显示FutureCallback,但问题是 ProgressDialog 仅在第一次显示时,我第二次按下按钮时没有出现。
  • 我想为变量设置一些消息并将其返回到ProgressDialog方法,以便我可以根据String参数的值处理特定任务,但只有在执行完整个后才调用onPostExecute任务。

我们将不胜感激任何建议。

3 个答案:

答案 0 :(得分:2)

这里你在调用asynctask中的另一个线程。所以最新发生的事情就是新线程被调用。 Asynctask不是在等待你的离线线程完成,因此它将进入onPostExecute。

我认为你不需要这里的asynctask因为Ion已经异步地提出了请求。无论你在onPostExecute()中做什么,你都可以把它放在离线调用的onComplete()中。

答案 1 :(得分:1)

这样做,

string = ''
for letter in a:
    string += letter

答案 2 :(得分:1)

您传入onCompleted()方法的

setCallback()方法是一个异步调用的回调方法,因此当从服务器返回响应时将调用此回调,这需要时间,这就是为什么{{{在onPostExecute之前调用方法。

futureTask lib已经使用异步调用,因此您不需要使用AsyncTask。您只需要执行以下操作:

Ion