调用AsyncTask.get()时未显示ProgressDialog

Ogu*_*han 17 android progressdialog android-asynctask

可能重复:
AsyncTask阻止UI威胁并显示延迟的进度条

我想在从任何服务器检索JSON时显示progressDialog.所以我使用AsyncTask作为解决方案(不确定任何不同的出路).

一切都很好,ProgressDialog正常工作,直到我使用AsyncTask实例调用.get()方法.我想它会以某种方式阻止UI.这是我的AsyncTask:

public class myAsync extends AsyncTask<String, String, List> {

    String message; // for dialog message
    ProgressDialog progress; 
    Intent myIntent;
    Context ctx;

    public myAsync(String message, Context ctx) {
        this.message = message;
        this.ctx = ctx;
        progress = new ProgressDialog(ctx);
    }

    @Override
    protected void onPreExecute() { 
        progress.setMessage(message);
        progress.setIndeterminate(true);
        progress.setCancelable(false);
        progress.show();    
    }

    @Override
    protected List doInBackground(String... params) {
        //returns any list after the task
        return anyList; 
    }

    @Override
    protected void onPostExecute(List result) {
        if(progress.isShowing())
            progress.dismiss();
    }
}
Run Code Online (Sandbox Code Playgroud)

这里是调用AsyncTask的myActivity:

myAsync asyncTask = new myAsync("Loading...", this);
asyncTask.execute("Any string", "Other string");
asyncTask.get(); // If I comment out this line, ProgressDialog works
Run Code Online (Sandbox Code Playgroud)

执行后,当我尝试从doInBackground和onPostExecute记录结果时,都没有问题.但是,如果我想使用.get(),结果ProgressDialog没有显示或显示的时间很短(可能是0.2秒)

有什么问题?

rds*_*rds 26

是,如果需要get() 等待计算完成,然后检索其结果.这意味着,您正在阻止UI线程,等待结果.

解决方案:不要打电话 get

通常,您将调用函数(回调)postExecute.

  • 有关示例实现,请参见http://stackoverflow.com/questions/3291490/common-class-for-asynctask-in-android (2认同)
  • 但如果我想使用AsyncTask的返回值并在返回值的基础上我想调用新的URL所以我能为此做些什么?我想通过这种方式我们必须使用.get没有它,如果有任何选择,那么请帮助我 (2认同)

Jak*_*ton 16

调用.get()将您更改AsyncTask为有效的" SyncTask",因为它会导致当前线程(可能是UI线程)等待,直到AsyncTask完成其处理.既然你现在阻塞UI线程中调用ProgressDialog.show()方法从来没有得到一个机会,让对话框本身绘制屏幕.

删除呼叫将允许它在后台正常运行.

如果你需要在任务完成后进行处理,我建议你把它放在onPostExecute方法本身或使用回调Activity来自onPostExecute.