Android中的AsyncTask不会退出

时间:2015-07-03 15:24:36

标签: android android-asynctask

我有一个AsyncTask,可以加载一些内容并将其放在屏幕上。这是代码:

private class ContentLoader extends AsyncTask<Void, Void, Void>{
    private boolean running = false;

    protected Void doInBackground(Void... params){
        running = true;
        while (running){
            try {
                publishProgress();
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                Log.d("ContentLoader", String.valueOf(e));
            }
        }
        return null;
    }

    protected void onProgressUpdate(Void... progressParams){
        setContents();
    }

    public void exit(){
        Log.d("ContentLoader-exit before", String.valueOf(running));
        running = false;
        Log.d("ContentLoader-exit after", String.valueOf(running));
    }
}

setContents() - 方法从SQLite数据库加载一些文本并将其设置为TextViews,这些都可以正常工作,直到我尝试退出任务。当我调用exit-method时,两个日志条目都显示值“false”,循环继续。

我从我的Activity的onCreate-method调用该任务:

public class MainActivity extends ActionBarActivity {
ContentLoader contentLoader = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    contentLoader = new ContentLoader();
    contentLoader.execute();
}

我想让它退出onBackPressed:

@Override
public void onBackPressed(){
    super.onBackPressed();
    if (contentLoader != null){
        contentLoader.exit();
    }
    finish();

那怎样才能让这个东西退出?谢谢你的回答!

3 个答案:

答案 0 :(得分:0)

尝试使用cancel方法取消AsyncTask并在while循环条件中使用isCancelled方法。

以下是一个例子:

private class ContentLoader extends AsyncTask<Void, Void, Void>{

    protected Void doInBackground(Void... params){
        running = true;
        while (!isCancelled()){
            try {
                publishProgress();
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                Log.d("ContentLoader", String.valueOf(e));
            }
        }
        return null;
    }

    protected void onProgressUpdate(Void... progressParams){
        setContents();
    }

}

然后使用cancel方法取消任务

ContentLoader contentLoader = new ContentLoader();
contentLoader.execute();
contentLoader.cancel(true);

答案 1 :(得分:0)

使用contentLoader.cancel(boolean mayInteruptIfRunning)其中boolean mayInteruptIfRunning如果为true将中断正在运行的线程,否则它将允许它完成然后取消它。

您可以使用contentLoader.isCancelled()

查看状态

答案 2 :(得分:0)

您需要使用cancel mathod:

@Override
public void onBackPressed(){
    super.onBackPressed();
    if (contentLoader != null){
        contentLoader.cancel();
    }
    finish();

如果AsyncTask有循环,请执行:

@Override
Void doInBackground(Void... params) {
    for(;;)
        if(isCancelled())
            return null;
}

如果您使用URLConnection之类的内容,请执行此操作

@Override
Void doInBackground(Void... params) {
    URLConnetcion uc = new URLConnection(new URL());

    if(isCancelled())
        return null;
    else
        //your normal processing
        process();
}