2017-02-28 214 views
0

我在这个主题上做了大量的阅读,但没有找到正确的解决方案。取消AsyncTask的问题

我有一个程序,它执行网络发现(使用ping)。我不明白你如何停止异步任务。我正在做一个任务。(真)但它似乎什么都不做。最重要的是,我正在做一段时间()来检查任务是否被取消,并立即返回true。

序列:是开始(正常工作)我等5-10个IP地址,我点击按钮停止。然后我点击开始,但发现任务没有执行。

我们真的可以停止异步任务吗?怎么样?它的延迟是什么?

编辑

我迷路了。 Stackoverflow中的所有Q都声明取消(true)需要来自任务。

  1. 我有一个例子,我叫取消(真)doinbackground内,但它并没有引发onCancelled

  2. 大多数情况下(至少循环)停得来的外任务。我下面的例子只是在循环计数器上播放。这样可行。

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

    } 
} 
+2

检查http://stackoverflow.com/a/2740204/4854450 –

回答

1

你不能停止的AsyncTask这种方式。您可以随时使用discover.cancel(true);,但必须手动停止它 - 在doInBackground方法中检查值discover.isCancelled()。否则AsyncTask将调用整个doInBackground方法,但不会经过onPostExecute

具有内置 onCancelled()方法
0

的AsyncTask像onPostExecute()

@Override 
    protected void onCancelled() { 
     super.onCancelled(); 
    } 

,你需要定期检查的AsyncTask的状态,在后台的功能,当你取消它,onCancelled()方法将调用,而不是onPostExecute()