我有一个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();
那怎样才能让这个东西退出?谢谢你的回答!
答案 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();
}