调用removeCallbacks后,runnable中的asynctask不会停止

时间:2013-09-24 16:06:48

标签: android android-asynctask android-handler

我有一个名为myAsync的asynctask,它执行一些网络操作(从服务器获取数据,并解析json)。

一旦活动运行,我也会创建一个处理程序。

我还有一个runnable,我在其中运行asynctask。我使用runnable的原因是因为我将在Handler的postdelayed方法中使用它,因为我希望每1分钟重复一次。

Runnable runnable = new Runnable()
{
    public void run()
    {
        new myAsync ().execute();
    }
};

然后我在onResume中使用上面的runnable;

@Override
protected void onResume()
{
    super.onResume();
            handler.postDelayed(runnable, 60000);
    }

每当我离开活动时,我都希望支票停止,所以我打电话,

 handler.removeCallbacks(runnable);

然而,asynctask继续不停地运行。 我该怎么办?

3 个答案:

答案 0 :(得分:5)

asynctask的重点是在主线程上运行一个线程。 因此,在Runnable()

中运行它是没有意义的

答案 1 :(得分:4)

你可以做的是跳过RunnableHandler ...这里绝对不需要。假设AsyncTaskActivity的内部类,您可以设置成员布尔变量并在doInBackground()

中检查
public Void doInBackground(Void...params)
{
     // this is a boolean variable, declared as an
     //Activity member variable, that you set to true when starting the task
     while (flag)  
     {
         // run your code
         Thread.sleep(60000);
     }

     return null; // here you can return control to onPostExecute()
                  // if you need to do anything there
}

这将使AsyncTask睡眠一分钟再次运行代码。然后在onPause()或您想要的任何地方将标志设置为false。如果您需要更新UI,请在publishProgress()内拨打loop,并将UI代码放入onProgressUpdate()

答案 2 :(得分:0)

您可以删除AsyncTask并使用Runnable执行proccess,这样您就可以进行所需的重复。如果这不起作用,你可以设置一个标志来停止proccess,就像所说的codeMagic一样。

runable = new Runnable() {  
 public void run() {
  try {
   //Proccess
   while (flag)  
   {
    //Proccess
    handler.postDelayed(this, 3000);
   }
  }catch(Exception e)
  {
   Log.i("Log","Error: "+e);                                        
  }
 };
handler.postDelayed(runable, 3000);



@Override
 public void onPause() {
    super.onPause();
   flag=false;
   handler.removeCallbacks(runnable);
 }

 @Override
 public void onResume() {
    super.onResume();
   flag=true;
   handler.postDelayed(runable, 3000);
 }

我希望这有帮助。