Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果异步任务需要时间,则显示ProgressDialog_Android_Android Asynctask_Progressdialog - Fatal编程技术网

Android 如果异步任务需要时间,则显示ProgressDialog

Android 如果异步任务需要时间,则显示ProgressDialog,android,android-asynctask,progressdialog,Android,Android Asynctask,Progressdialog,我有一个类似这样的任务: private class RetrieveDataAsyncTask extends AsyncTask<Void, Void, Boolean> { ProgressDialog progressDialog; @Override protected void onPreExecute() { progressDialog = ProgressDialog.show(getSherlockActivit

我有一个类似这样的任务:

private class RetrieveDataAsyncTask extends AsyncTask<Void, Void, Boolean> {

    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
            progressDialog = ProgressDialog.show(getSherlockActivity(), "In progress", "Loading"); 
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        try {
            currentScreen.retrieveData();
            return true;
        } catch (IOException ex) {
            return false;
        }
    }

    @Override
    protected void onPostExecute(Boolean result) {
            progressDialog.dismiss();
            if (result) {
                currentScreen.retrieveDataFinished();
            } else {
                showExceptionOccurred();
            }
    }
final Handler handler = new Handler();


private class RetrieveDataAsyncTask extends AsyncTask<Void, Void, Boolean> {

    ProgressDialog progressDialog = null;

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected Boolean doInBackground(Void... params) {
        handler.postDelayed(pdRunnable, 500);

        try {
            currentScreen.retrieveData();
            return true;
        } catch (IOException ex) {
            return false;
        }
    }

    @Override
    protected void onPostExecute(Boolean result) {
            handler.removeCallbacks(pdRunnable);
            if(progressDialog != null)
                 progressDialog.dismiss();

            if (result) {
                currentScreen.retrieveDataFinished();
            } else {
                showExceptionOccurred();
            }
    }

    final Runnable pdRunnable = new Runnable() {
            @Override
            public void run() {
                progressDialog = ProgressDialog.show(getSherlockActivity(),
                "In progress", "Loading");
            }
    };

}
私有类RetrieveDataAsyncTask扩展了AsyncTask{
进行对话进行对话;
@凌驾
受保护的void onPreExecute(){
progressDialog=progressDialog.show(getSherlockActivity(),“正在进行”,“正在加载”);
}
@凌驾
受保护的布尔doInBackground(Void…params){
试一试{
currentScreen.retrieveData();
返回true;
}捕获(IOEX异常){
返回false;
}
}
@凌驾
受保护的void onPostExecute(布尔结果){
progressDialog.disclose();
如果(结果){
currentScreen.retrieveDataFinished();
}否则{
showExceptionOccurred();
}
}
现在,当AsyncTask花费的时间少于500毫秒时,我不想显示ProgressDialog,它只会导致闪烁,并且可能会令人恼火。 我想要的是等待500毫秒,检查AsyncTask是否仍然忙,如果忙,则显示ProgressDialog


我如何才能做到这一点?

试着这样做:

private class RetrieveDataAsyncTask extends AsyncTask<Void, Void, Boolean> {

    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
            progressDialog = ProgressDialog.show(getSherlockActivity(), "In progress", "Loading"); 
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        try {
            currentScreen.retrieveData();
            return true;
        } catch (IOException ex) {
            return false;
        }
    }

    @Override
    protected void onPostExecute(Boolean result) {
            progressDialog.dismiss();
            if (result) {
                currentScreen.retrieveDataFinished();
            } else {
                showExceptionOccurred();
            }
    }
final Handler handler = new Handler();


private class RetrieveDataAsyncTask extends AsyncTask<Void, Void, Boolean> {

    ProgressDialog progressDialog = null;

    @Override
    protected void onPreExecute() {

    }

    @Override
    protected Boolean doInBackground(Void... params) {
        handler.postDelayed(pdRunnable, 500);

        try {
            currentScreen.retrieveData();
            return true;
        } catch (IOException ex) {
            return false;
        }
    }

    @Override
    protected void onPostExecute(Boolean result) {
            handler.removeCallbacks(pdRunnable);
            if(progressDialog != null)
                 progressDialog.dismiss();

            if (result) {
                currentScreen.retrieveDataFinished();
            } else {
                showExceptionOccurred();
            }
    }

    final Runnable pdRunnable = new Runnable() {
            @Override
            public void run() {
                progressDialog = ProgressDialog.show(getSherlockActivity(),
                "In progress", "Loading");
            }
    };

}
final Handler=new Handler();
私有类RetrieveDataAsyncTask扩展了AsyncTask{
ProgressDialog=null;
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的布尔doInBackground(Void…params){
handler.postDelayed(pdRunnable,500);
试一试{
currentScreen.retrieveData();
返回true;
}捕获(IOEX异常){
返回false;
}
}
@凌驾
受保护的void onPostExecute(布尔结果){
handler.removeCallbacks(pdRunnable);
如果(progressDialog!=null)
progressDialog.disclose();
如果(结果){
currentScreen.retrieveDataFinished();
}否则{
showExceptionOccurred();
}
}
final Runnable pdRunnable=new Runnable(){
@凌驾
公开募捐{
progressDialog=progressDialog.show(getSherlockActivity(),
“进行中”、“装载中”);
}
};
}

斯坦的建议似乎是正确的:

请在
onPreExecute()
中尝试以下行:


如果采用strightforward方法,将onPreExecute中的TimerTask调度为500 ms,并在onPostExecute中取消它,那么该方法如何?对话框的创建应在计时器任务中移动。在doInBackGround()中编写检查时间500 ms的代码,如果该时间仍然繁忙,则使用publishProgress方法和onProgressUpdate()进行start ProgressDialog..@user370305,否,处理完成后,计时器任务立即取消。