0

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

活动运行后,我还创建了一个处理程序。

我还有一个运行异步任务的可运行文件。我使用 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 继续不停地运行。我该怎么办 ?

4

3 回答 3

5

的重点asynctask是在主线程上运行一个线程。所以运行它没有意义Runnable()

于 2013-09-24T16:10:39.347 回答
4

你可以做的是跳过Runnableand Handler...这里绝对不需要。假设AsyncTask是您的内部类Activity,您可以设置一个成员布尔变量并在您的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 的地方或任何地方。如果您需要更新UIthen 中的调用并将代码publishProgress()放入loopUIonProgressUpdate()

于 2013-09-24T16:15:59.310 回答
0

您可以删除 AsyncTask 并使用 Runnable 执行该过程,这样您就可以进行所需的重复。如果这不起作用,您可以设置一个标志来停止该过程,如所说的 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);
 }

我希望这会有所帮助。

于 2013-09-24T18:00:54.407 回答