当AsyncTask在后台运行时,看不到ProgressDialog

时间:2014-09-09 19:31:08

标签: java android android-asynctask progressdialog

我在我的应用程序中使用AsyncTask下载网址。我在onPreExecute()上使用ProgressDialog进行等待。 但是我在进程结束时看不到ProgressDialog,我看了一会儿。想要在下载之后看到它。 谁能帮我。 谢谢 我的代码是这样的:

  

private class loadMoreListView extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        // Showing progress dialog before sending http request
        pDialog = new ProgressDialog(SingleMenuItemActivity.this);
        pDialog.setMessage("Please Wait ...");
        pDialog.isIndeterminate();
        pDialog.setCancelable(false);
        pDialog.show();
    }

    protected Void doInBackground(Void... unused) {
        runOnUiThread(new Runnable() {
            public void run() {

           // do something for downloading

        }
        });

        return (null);
    }


    protected void onPostExecute(Void unused) {
        // closing progress dialog
        pDialog.dismiss();
    }
}

3 个答案:

答案 0 :(得分:1)

 runOnUiThread(new Runnable() {
            public void run() {
           // do something for downloading
        }

//在runOnUiThread中执行下载操作是错误的。 runOnUiThread在UI线程上运行“执行下载操作”,并且您的应用程序应该因NetworkOnMainThreadException而崩溃,您的应用程序在设备上运行的版本比GingerBread的android更重要。不同的是,它会阻止ui线程阻止他绘制进度条

答案 1 :(得分:1)

问题在于

runOnUiThread(new Runnable(){

        public void run() {

       // do something for downloading

    }
    });  
如果UI线程仍然忙,则

ProgressDialog不会更新。 SO中有很多例子。 我不明白为什么你需要UIthread。 根据经验 - 如果你需要进度对话框,你需要让它在后台线程中运行asynctask,就像它一直做的那样。阅读文档

http://developer.android.com/reference/android/os/AsyncTask.html

您可以使用以下示例

http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

答案 2 :(得分:0)

首先注意&#34; @ override&#34;标题附加到所有AsyncTask Implemented方法,例如。

private class loadMoreListView extends AsyncTask<Void, Void, Void> {

    ProgressDialog pDialog;

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        pDialog = new ProgressDialog(SingleMenuItemActivity.this);
        pDialog.setMessage("Please Wait ...");
        pDialog.isIndeterminate();
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        pDialog.cancel();

    }

}

除非您必须在UI上执行某些操作,否则请从doInBackground中删除它。

runOnUiThread(new Runnable() {
        public void run() {

       // do something for downloading

    }
    });

您无法在runOnUiThread上进行下载。 doInBackground用于运行UI等不可见的下载等后台任务。