Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.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
Java Android中AsyncTask线程停止或不在progressDialog中的问题_Java_Android_Android Asynctask - Fatal编程技术网

Java Android中AsyncTask线程停止或不在progressDialog中的问题

Java Android中AsyncTask线程停止或不在progressDialog中的问题,java,android,android-asynctask,Java,Android,Android Asynctask,我有一个如下的代码,每次我取消对话框,就会出现中断异常,cancel方法实际上不起作用。如下所示,我在onPostExecute方法中打印cancel的状态,它是false而不是true。在添加isRunning参数之前,显然线程仍在后台运行。虽然isRunning确实停止了线程(执行了onPostExecute方法),但我想知道为什么会发生异常,以及为什么在isCanceled方法中仍然得到false。谢谢 public void startDownload(View view){ d

我有一个如下的代码,每次我取消对话框,就会出现中断异常,
cancel
方法实际上不起作用。如下所示,我在
onPostExecute
方法中打印
cancel
的状态,它是false而不是true。在添加
isRunning
参数之前,显然线程仍在后台运行。虽然
isRunning
确实停止了线程(执行了
onPostExecute
方法),但我想知道为什么会发生异常,以及为什么在
isCanceled
方法中仍然得到
false
。谢谢

public void startDownload(View view){
    dialog = new ProgressDialog(this);
    final Downloader downloader = new Downloader(this, dialog);
    downloader.execute(0);
    dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            downloader.cancel(true);
        }
    });
}

公共类下载程序扩展异步任务{
私人语境;
私有PowerManager.WakeLock WakeLock;
私人对话;
公共布尔值isRunning=true;
公共下载程序(上下文,ProgressDialog){
this.context=上下文;
this.dialog=dialog;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
PowerManager pm=(PowerManager)context.getSystemService(context.POWER\u服务);
wakeLock=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
getClass().getName());
wakeLock.acquire();
setMessage(“下载…”);
对话框。setUndeterminate(true);
设置ProgressStyle(ProgressDialog.STYLE_水平);
对话框。可设置可取消(false);
dialog.setButton(ProgressDialog.BUTTON_否定,“取消”,新建DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
isRunning=false;
}
});
dialog.show();
}
@凌驾
受保护的字符串doInBackground(整数[]参数){
int count=参数[0];

(count确保您没有执行另一个异步任务,或者使用
.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR)
而不是
.execute()
,并行启动此异步任务。否则,如果您已经在后台运行另一个异步任务,则在最后一个异步任务完成之前,此异步任务不会运行

另一方面,尝试不使用自定义布尔值跟踪AsyncTask生命周期状态,为此,请使用
isCancelled()
在运行时检查内容或中断任何循环,如果需要,请重写AsyncTask的
onCancelled()
方法以实现此时可能需要的任何功能


不要忘记检查引用:。

确保您没有执行另一个异步任务,或者使用
.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR)
而不是
.execute()并行启动此任务
。否则,如果您已经在后台运行另一个异步任务,则在最后一个任务完成之前,该任务将不会运行

另一方面,尝试不使用自定义布尔值跟踪AsyncTask生命周期状态,为此,请使用
isCancelled()
在运行时检查内容或中断任何循环,如果需要,请重写AsyncTask的
onCancelled()
方法以实现此时可能需要的任何功能


别忘了检查参考:。

您可以删除
线程睡眠(200);
并重试吗?您可以删除
线程睡眠(200);
并重试吗?
public class Downloader extends AsyncTask<Integer, Integer, String> {
private Context context;
private PowerManager.WakeLock wakeLock;
private ProgressDialog dialog;
public boolean isRunning = true;

public Downloader(Context context, ProgressDialog dialog) {
    this.context = context;
    this.dialog = dialog;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
            getClass().getName());
    wakeLock.acquire();

    dialog.setMessage("Downloading...");
    dialog.setIndeterminate(true);
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    dialog.setCancelable(false);
    dialog.setButton(ProgressDialog.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            isRunning = false;
        }
    });
    dialog.show();
}

@Override
protected String doInBackground(Integer[] params) {
    int count = params[0];
    while(count<100 && isRunning){
        publishProgress(count);
        try{
            count++;
            System.out.println(count);
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    return null;
}

@Override
protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);
    dialog.setIndeterminate(false);
    dialog.setMax(100);
    dialog.setProgress(values[0]);
}

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    wakeLock.release();
    dialog.dismiss();
    if (s != null)
        Toast.makeText(context,"Download error: "+ s, Toast.LENGTH_LONG).show();
    else
        Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show();
    System.out.println(isCancelled());
}