我有一个名为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继续不停地运行。 我该怎么办?
答案 0 :(得分:5)
asynctask
的重点是在主线程上运行一个线程。
因此,在Runnable()
答案 1 :(得分:4)
你可以做的是跳过Runnable
和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。如果您需要更新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);
}
我希望这有帮助。