【问题标题】:Why my progressDialog never ends?为什么我的progressDialog 永远不会结束?
【发布时间】:2015-08-28 20:17:42
【问题描述】:

我的 Android 项目中有一个 MainActivity 类。在其中,我有一个AsyncTask 来检索有关我的Cars 的所有信息,并使用我的API REST 的GET 方法,我想将它们添加到我的MainActivity 类中的一个ArrayList 中。因此,我想添加一个在我的 AsyncTask 完成的同时完成的 ProgressDialog

我已经在我的 MainActivity 顶部声明了我的 ProgressDialog:

private ProgressDialog progressDialog;

还有,我的ArrayList 的汽车定义在我的MainActivity 的顶部:

ArrayList<Car> cars = new ArrayList<Car>(); //This is the ArrayList that I have on my MainActivity class

然后,我运行我的AsyncTask 并在我的MainActivity 类的onCreate 方法中初始化我的ProgressDialog

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setMessage("Loading...");
        progressDialog.setCancelable(true);
        progressDialog.setMax(100);

        new chargeCars().execute();
    }

这是我的 AsyncTask:

class chargeCars extends AsyncTask<Void, Integer, Boolean> {

    protected void onPreExecute(){
        progressDialog.setProgress(0);
        progressDialog.show();
    }

    protected Boolean doInBackground(Void... params) {

        //Here all the code to get my information from an HTTP Response, the data it's retrieving OK.

           //Here there is a for loop to add all the elements to my ArrayList cars.
            {
                cars.add(new Car(idCar, model));

                publishProgress(10);

                if(isCancelled())
                    break;
            }

        publishProgress(100);
        return true;
    }

    protected void onProgressUpdate(Integer... values){
        int progress = values[0].intValue();

        progressDialog.setProgress(progress);
    }

    protected void onPostExecute(boolean c){

        if(c)
        {
            Toast.makeText(MainActivity.this, "Finished task!",
                    Toast.LENGTH_SHORT).show();
        }

        if(progressDialog != null && progressDialog.isShowing()){
            progressDialog.dismiss();
        }
    }

    protected void onCancelled() {
        Toast.makeText(MainActivity.this, "Canceled task",
                Toast.LENGTH_SHORT).show();
    }
}

问题在于ProgressDialog 永远不会结束,它总是在屏幕上。为什么总是显示?我的 AsyncTask 是否一直在运行?永无止境?

注意:我的 HTTP 响应信息来自我的 API REST,因为我在检索信息后放置了一些日志,并且它是正确的,显然它存储在 ArrayList (在将信息添加到我的 ArrayList 之后,我也放了一些日志,它给了我存储的信息)但是当我在 AsyncTask 上执行 cars.size() 后将 cars.size() 放在 onCreate() 方法上时,它给了我它等于的大小到 0。这就是我将 ProgressDialog 放在 AsyncTask 中的原因,因为我认为它可能还没有完成,然后我确信 AsyncTask 已经完成。这可能是解决方案吗?我需要再做一次改变吗?

请给我点灯,因为我完全被这里挡住了。

编辑:我编辑了我的代码。

EIDT 2: 更新代码后,ProgressDialog 仅在我触摸手机屏幕时才会消失。在其他情况下,它不会消失。

提前致谢!

【问题讨论】:

    标签: java android arraylist android-asynctask progressdialog


    【解决方案1】:

    使用dismiss() 方法!

      @override
       protected void onPostExecute(boolean c){
    
                if(c)
                {
                    Toast.makeText(MainActivity.this, "Finished task!",
                            Toast.LENGTH_SHORT).show();
                }
               if(progressDialog != null && progressDialog.isShowing()){
                     progressDialog.dismiss();
               }
            }
    

    解雇()

    在 API 级别 1 中添加 关闭此对话框,将其从屏幕上移除。 可以从任何线程安全地调用此方法。请注意,您 当对话框打开时,不应覆盖此方法进行清理 被解雇,而是在 onStop() 中实现它。

    【讨论】:

    • 我添加了 Jayesh Elamgodil 对我说,但它也没有用。可能是什么问题?
    • 嘿!我认为您缺少 AsyncTask 方法的 @override。
    • 使用@overrride 有什么区别?
    【解决方案2】:

    问题是AsyncTask 中的方法onPauseonDestroy 不会覆盖类中的任何内容,因此永远不会被调用。如果您需要在 AsyncTask 完成时完成某些操作,请将其放入方法 onPostExecute(在 UI 线程上运行)。您应该删除这两个方法(因为它们没用)并按如下方式设置您的 onPostExecute 方法:

    protected void onPostExecute(boolean c){
        if(c) {
            Toast.makeText(MainActivity.this, "Finished task!",
                    Toast.LENGTH_SHORT).show();
        }
    
        if(progressDialog != null && progressDialog.isShowing()){
            progressDialog.dismiss();
        }
    }
    

    请参阅Android docs 了解AsyncTask 中可用的方法

    【讨论】:

    • 我有一些疑问。当您说do not override anything 时,您到底是什么意思。覆盖是什么意思? (对不起,如果这是一个明显的问题)。另一个疑问,我在此之前运行了另一个 AsyncTask,它设置了 CustomAdapter 上的值,该值显示列表中的值。之前(使用 onPause 和 onDestroy 方法)它没有出现,现在它出现了。但是 ProgressDialog 它仍然显示并且第二个 AsyncTask 的信息没有出现。第一个 AsyncTask 可能会阻止第二个?谢谢!
    【解决方案3】:

    在你的 onPostExecute 添加,

    if(progressDialog != null && progressDialog.isShowing()){
            progressDialog.dismiss();
        }
    

    【讨论】:

    • 它也一直在执行自己,永无止境。为什么会这样?
    猜你喜欢
    • 2011-08-04
    • 2020-09-11
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2013-09-11
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多