我在这个主题上做了大量的阅读,但没有找到正确的解决方案。取消AsyncTask的问题
我有一个程序,它执行网络发现(使用ping)。我不明白你如何停止异步任务。我正在做一个任务。(真)但它似乎什么都不做。最重要的是,我正在做一段时间()来检查任务是否被取消,并立即返回true。
序列:是开始(正常工作)我等5-10个IP地址,我点击按钮停止。然后我点击开始,但发现任务没有执行。
我们真的可以停止异步任务吗?怎么样?它的延迟是什么?
编辑
我迷路了。 Stackoverflow中的所有Q都声明取消(true)需要来自任务。
我有一个例子,我叫取消(真)doinbackground内,但它并没有引发onCancelled
大多数情况下(至少循环)停得来的外任务。我下面的例子只是在循环计数器上播放。这样可行。
一个interisting评论从wrygiel在Q Ideal way to cancel an executing AsyncTask
来到这将是巨大的,有一个真实的例子。
这里是我的代码修改,但onCancelled没有工作,所以我玩循环计数器。
public class MainActivity extends AppCompatActivity {
TextView text;
Discover discover;
int count;
private boolean running = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button start = (Button) findViewById(R.id.start);
Button stop = (Button) findViewById(R.id.stop);
text = (TextView) findViewById(R.id.txt);
start.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
discover = new Discover();
discover.execute();
}
});
stop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// if(discover != null)
// discover.cancel(true);
count = 255;
}
});
}
private class Discover extends AsyncTask<Object, String, Void> {
@Override
protected Void doInBackground(Object... params) {
String ip;
Ping ping = new Ping();
for(count=1;count<255;count++) {
if(!running) {
count = 255;
Log.i("Discover", "task terminated");
}
ip = "192.168.1." + count;
if (!ping.pong(ip))
publishProgress(ip+" not alive ");
else
publishProgress(ip+" is alive");
}
return null;
}
@Override
protected void onPreExecute() {
text.setText("Start search...");
super.onPreExecute();
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
text.setText(values[0]);
}
@Override
protected void onPostExecute(Void result) {
text.setText("Task finished");
super.onPostExecute(result);
}
@Override
protected void onCancelled() {
running = false;
super.onCancelled();
}
}
}
检查http://stackoverflow.com/a/2740204/4854450 –