为什么我的progressDialog永远不会结束?

时间:2015-06-12 18:04:36

标签: java android arraylist android-asynctask progressdialog

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

我已将我的ProgressDialog声明为MainActivity的顶部:

private ProgressDialog progressDialog;

此外,我ArrayList顶部定义了MainActivity辆汽车:

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

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

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之后也添加了一些日志,它会为我提供存储的信息)但是当我在cars.size()上执行AsyncTask后{} {1}}方法告诉我,它的大小等于0.这就是我将onCreate()放入ProgressDialog内部的原因,因为我认为它也许还没有完成,然后我确保AsyncTask已经完成。这可能是解决方案吗?我还要做出另一个改变吗?

请带我点亮,因为我完全阻止了。

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

EIDT 2:随着代码的更新,当我触摸手机屏幕时,ProgressDialog只会消失。在其他情况下,它不会消失。

提前致谢!

3 个答案:

答案 0 :(得分:0)

在你的onPostExecute add中,

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

答案 1 :(得分:0)

使用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()中实现。

答案 2 :(得分:0)

问题是,onPause中的方法onDestroyAsyncTask不会覆盖类中的任何内容,因此永远不会被调用。如果在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();
    }
}

有关AsyncTask

中可用的方法,请参阅Android docs