Android ProgressDialog 结束得太早

Android ProgressDialog ends too early

我是 运行 一个 AsyncTask,它打开一个 HttpConnection 并用它在 doInBackground 函数中下载 JSON。

这是我的 AsyncTask:

    public class AsyncQueryTask extends AsyncTask<URL, Void, String>{
    String jsonString = "";
    ProgressDialog progressDialog;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = new ProgressDialog(LoginActivity.this);
        progressDialog.setCancelable(false);
        progressDialog.setMessage("Getting Ready...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setProgress(0);
        progressDialog.show();
    }

    @Override
    protected String doInBackground(URL... urls) {
        URL restURL = urls[0];
        try {
            //--------------------------------------------
            // Some initialization
            //--------------------------------------------
            HttpURLConnection urlCon = (HttpURLConnection) restURL.openConnection();
            InputStream in = urlCon.getInputStream();
            Scanner scan = new Scanner(in).useDelimiter("\A");
            jsonString = scan.hasNext()? scan.next() : "";

            try{
                JSONArray bookArr = new JSONArray(jsonString);
                for(int i=0;i<bookArr.length();i++){
                    // Some JSON string processing...
                }

            } catch(Exception e){
                Log.e("Err", "@Activity");
                e.printStackTrace();
            }
            //----------------------------------------------------

            return jsonString;
        } catch(IOException ioe){
            ioe.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        progressDialog.dismiss();
    }
}

我在这里称它为:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        URL url = // URL for fetching JSON string
        if (/*Some condition*/) {
            //----------------------------------------------
            // Some other tasks
            //----------------------------------------------
            AsyncQueryTask fbqt = new AsyncQueryTask();
            fbqt.execute(url);

            Intent intent = new Intent(context, NextActivity.class);
            startActivity(intent);
         }
    }

如您所见,我在 onPreExecute() 中正确初始化了 progressDialog,dismiss()onPostExecute() 中正确初始化了它。

问题是进度对话框只显示几分之一秒就立即结束,导致应用程序转移到下一个activity,没有完全执行它在 doInBackground() 部分中的任务。

我应该怎么做才能使 progressDialog 持续到 doInBackground() 线程完成?

我想是因为这个:

 AsyncQueryTask fbqt = new AsyncQueryTask();
 fbqt.execute(url);

 Intent intent = new Intent(context, NextActivity.class);
 startActivity(intent);

您正在 LoginActivity 上使用 ProgressDialog,但就在您执行 fbqt 之后,您启动了另一个 activity (NextActivity),它将 LoginActivity 在暂停周期,所以我想这会关闭对话框!


注意:我不理解你的代码逻辑,但我认为你是在从 fbqt 获得结果后尝试启动 NextActivity,如果是,那么你实施的是错误的,你应该使用接口从 AsyncTask 获取回调,然后启动您的 NextActivity.

您的方式可能会导致 window 泄漏。 Intent intent = new Intent(context, NextActivity.class); startActivity(intent); 将上面的代码放在 onPostExecute() 方法中。