2013-01-08 28 views
0

我有两个不同的类2个AsyncTasks但问题是当第一是在不执行所述第二backgroung状态做。第一个asyncTask如果在循环中执行,因为它需要每5秒更新一次新数据。如果我停止任务(condition = flase),那么第二个完美的工作。执行两个的AsyncTask在两个不同的类

第一类:

public class MapScreen extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map_screen); 

     UpdateUserCords updateUC = new UpdateUserCords(); 
     updateUC.execute(); 
    } 

class UpdateUserCords extends AsyncTask<String, Void, String> 
{ 


    @Override 
    protected String doInBackground(String... params) { 


     while(condition) 
     { 

      //some code in loop... 


      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     return null; 

    } 

    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 


     super.onProgressUpdate(values); 
    } 

    @Override 
    protected void onPostExecute(String result) { 


     super.onPostExecute(result); 
    } 
} 

} 

二等:

public class Groups extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_groups); 


    getGroups getGr = new getGroups(); 
    getGr.execute(); //not executing, no error or crash 


} 


class getGroups extends AsyncTask<String, Void, String> 
{ 


    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); 

    @Override 
    protected String doInBackground(String... params) { 
     //some code... 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 

     super.onPostExecute(result); 
    } 


} 
} 

回答

3

的Android API 11后,AsyncTask开始吧,以在默认情况下连续执行运行,这意味着只有一个任务正在运行。为了让之前的以API 11的行为,这是对ThreadPoolExecutor运行,你需要在代码中指定它是这样的:

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) { 
    myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
} 
else { 
    myTask.execute(); 
} 

请看看这里了解更多信息: http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html

祝你好运!

P.S.它不推荐使用AsyncTask为无限线程,AsyncTask目的是做任务的背景,而不是永久运行,所以如果你想无限线程,我想你应该创建为Thread而不是作为AsyncTask

+0

谢谢,但我认为串行执行程序比ThreadPoolExecutor更好,如果它在更新的API版本中。它可能会导致代码问题或执行速度缓慢? – Dim

+0

这不是一些执行者比另一个更好,他们有不同的角色。串行执行程序意味着只有一个任务将在同一时间运行(这是默认设置,因为我记得,他们选择它作为默认值,因为很多人没有与多线程相处)。 ThreadPool执行器意味着许多任务可以在同一时间运行,并且这是您希望实现的行为,所以这是您需要用来实现它的执行器,非常简单。 – Elad92

+0

它的工作原理,谢谢Elad! – Dim

0

你asynctasks是在两个不同的活动。 随时只有一项活动处于活动状态。

+0

我知道我的asynctasks是在两个不同的活动,但是当我开始第二次活动,我可以看到第一个的AsyncTask仍在工作。这不是答案,它只是查看问题的另一种方式。 – Dim

+0

那么你应该在你的activity的onPause方法上调用asynctask cancel(boolean)方法,如果你想在离开活动时停止asynctask。你也可以执行上的onResume方法的AsyncTask,因此当用户来自另一项活动回来,的AsyncTask运行 –

-1

两个类延伸活性与其中只有一个是在同时运行。 如果你想有一个任务不是活动的寿命来执行时间越长,你必须把它包装成一个Service

+0

Actualy我不希望我的AsyncTask运行时间比我的活动,但是当我打开第二个活动首先是没有完成。我不希望完成它,因为我不希望用户可以通过按回退按钮 – Dim

+0

返回到第一个活动。一旦用户导航到另一个活动,如果您的活动被破坏或不在您的控制之下,它就不再受您的控制。查看http://developer.android.com/training/basics/activity-lifecycle/index.html如果你不停止你的Asycn Task,它可能会导致线程泄漏。那为什么要为此付出代价呢? –

+0

这是错误的,首先,如果一个活动正在运行,这并不意味着另一个活动已经完成,一个活动可以运行,另一个将被暂停。但即使他在Activity A中启动了AsyncTask,然后启动了Activity B,并且正如您所说的那样,Activity A被杀死了,AsyncTask仍然继续运行,所以这不是他所描述的问题。 – Elad92

相关问题