java - Android 中使用 AsyncTask 时有关线程已停止或未进行中的问题

标签 java android android-asynctask

我有如下代码,问题是每次我取消对话框时,都会发生 InterruptException 并且 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);
        }
    });
}


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());
}

}

最佳答案

确保您没有执行另一个 AsyncTask,或者使用 .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) 而不是 .execute() 并行启动此 AsyncTask。否则,如果您已经在后台运行另一个 AsyncTask,那么在最后一个 AsyncTask 完成之前,另一个 AsyncTask 将不会运行。

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

不要忘记检查引用:AsyncTask - Android Developers .

关于java - Android 中使用 AsyncTask 时有关线程已停止或未进行中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37549933/

相关文章:

java - Axis webservice 中的源 jar 从哪里加载?

java - Eclipse 中 AspectJ 项目中 JUnit 测试的 ClassNotFoundException

java - 从 Android 应用程序传递值并显示在控制台上

android - 异步任务Android执行

android - 如何在 Android 中使用 Fragments

android - 不推荐使用 AsyncTask 的 Xamarin 开发

java - java中如何在不关闭UI的情况下更新时间?

java - 使用 gdata-contacts 按群组名称获取联系人

java - Gradle 项目同步失败。基本功能 - 在 Android Studio 2.2 上失败

android - 如何在Android中使用okhttp库向api(http post)添加参数