进度对话框圈仅在任务后显示

时间:2012-09-21 13:58:34

标签: android android-asynctask progressdialog

我在AsyncTask中设置了一个进度圈。当asynctask正在执行时,它会显示大约一秒钟,然后消失。一旦任务完成,如果按下后退按钮,圆圈会显示很长时间。这是为什么?

private class AsyncGetRota extends AsyncTask<String, Void, Void> {

        ProgressDialog progressDialog;


        @Override
        protected void onPreExecute()
        {
            progressDialog= ProgressDialog.show(NfcscannerActivity.this, 
                    "Connecting to Server"," retrieving rota...", true);

            //do initialization of required objects objects here                
        };      


        @Override
        protected Void doInBackground(String... params) {



            try {
                Log.e(TAG, "inside doInBackground");
                rotaArray = nfcscannerapplication.loginWebservice.getRota(params[0], params[1]);

                cancel(true);



            } catch (Exception e) {
               e.printStackTrace();
            }
            return null;

        }

        @Override
        protected void onPostExecute(Void result)
        {
            super.onPostExecute(result);
            progressDialog.dismiss();
        };



    }

[更新]

getRota.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    Log.e(TAG, "onclicked getRota");

                    String[] params = new String[]{"36", "18-09-2012"}; 
                    AsyncGetRota agr = new AsyncGetRota();
                    agr.execute(params);

                    for(int i = 0; i < 60; i++){

                        if(agr.isCancelled() == true){
                            Log.e(TAG, "asyncTask is finished");
                            break;
                        }


                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }//end of for loop

                    Intent intent = new Intent(NfcscannerActivity.this,
                            GetRota.class);

                    Bundle b = new Bundle();
                    b.putSerializable("rotaArray", rotaArray);

                    intent.putExtra("rotaArrayBundle", b);
                    startActivity(intent);

                }// end of onclick
            });

3 个答案:

答案 0 :(得分:0)

尝试像这样实现它:

protected void onPreExecute() {
   dialog = new ProgressDialog(activity);
   dialog.setMessage("Processing...");
   dialog.show();
}

protected void onPostExecute(Void result) {
   if (dialog.isShowing()) {
       dialog.dismiss();
   } 
};

这总是对我有用

答案 1 :(得分:0)

这里有几个问题,你没有初始化ProgressDialog,初始化一个初始化你的ProgressDialog的构造函数......

 public AsyncGetRota(Activity activity) {
        this.activity = activity;
        dialog = new ProgressDialog(activity);
    } 

然后在onPostExecute中检查您的ProgressDialog是否为null,如此

@Override
    protected void onPostExecute(Void result)
    {
        super.onPostExecute(result);
        if(progressDialog != null)
        progressDialog.dismiss();
    }

答案 2 :(得分:0)

...
new MyAsyncTask().execute(string);
...
}

class MyAsyncTask extends AsyncTask<String, Void, Whatever > {
    ...
    @Override
    protected Whatever doInBackground(String... params) {

       Log.e(TAG, "inside doInBackground");
       rotaArray = nfcscannerapplication.loginWebservice.getRota(params[0],       params[1]);
       return rotaArray;
    }

    @Override
    protected void onPostExecute(Whatever result)
    {
        super.onPostExecute(result);
        if(progressDialog != null)
        progressDialog.dismiss();

        Intent intent = new Intent(NfcscannerActivity.this, GetRota.class);
        Bundle b = new Bundle();
        b.putSerializable("rotaArray", result);

        intent.putExtra("rotaArrayBundle", b);
        startActivity(intent);
    }
}

你应该在启动AsyncTask后继续执行,而不是使用某个循环或其他东西阻止它。