在两个不同的类在执行了两个的AsyncTask在 [英] Executing two asynctask in in two different classes

查看:128
本文介绍了在两个不同的类在执行了两个的AsyncTask在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个不同的类2 AsyncTasks,但问题是,当第一是在不执行所述第二backgroung状态做。第一的AsyncTask如果$ P $在循环pformed因为它需要每5秒钟更新新的数据。如果我停止任务(条件= FLASE)第二个完美的作品。

第一类:

 公共类MapScreen延伸活动{@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_map_screen);        UpdateUserCords updateUC =新UpdateUserCords();
        updateUC.execute();
    }类UpdateUserCords扩展的AsyncTask<弦乐,太虚,字符串>
{
    @覆盖
    保护字符串doInBackground(字符串... PARAMS){
        而(条件)
        {            //一些code在环...
            尝试{
                视频下载(5000);
            }赶上(InterruptedException的E){
                // TODO自动生成catch块
                e.printStackTrace();
            }
        }
        返回null;    }    @覆盖
    在preExecute保护无效(){        super.on preExecute();
    }    @覆盖
    保护无效onProgressUpdate(虚空......值){
        super.onProgressUpdate(值);
    }    @覆盖
    保护无效onPostExecute(字符串结果){
        super.onPostExecute(结果);
    }
}}

第二类:

 公共类组扩展活动{
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_groups);
    getGroups getGr =新getGroups();
    getGr.execute(); //不执行,没有错误或崩溃
}
类getGroups扩展的AsyncTask<弦乐,太虚,字符串>
{
    ArrayList的<&HashMap的LT;字符串,字符串>>菜单项=新的ArrayList<&HashMap的LT;字符串,字符串>>();    @覆盖
    保护字符串doInBackground(字符串... PARAMS){
        //一些code ...
        返回null;
    }    @覆盖
    在preExecute保护无效(){        super.on preExecute();
    }    @覆盖
    保护无效onPostExecute(字符串结果){        super.onPostExecute(结果);
    }
}
}


解决方案

Android的API 11后,的AsyncTask 开始吧,以在默认情况下连续执行程序运行,这意味着只有一个任务同时运行。为了得到前的行为,以API 11,这是在的ThreadPoolExecutor 运行,你需要在code像这样指定它:

 如果(Build.VERSION.SDK_INT> = Build.VERSION_ codeS.HONEYCOMB){
  myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
其他{
  myTask.execute();
}

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

祝你好运!

P.S。它不推荐使用的AsyncTask 的无限线程,的AsyncTask 目的是做后台任务,不一直运行下去,所以如果你想无限线程,我想你应该将其创建为,而不是作为一个的AsyncTask

I have 2 AsyncTasks in two different classes but the problem is when the first is do in backgroung state the second is not executed. The first asyncTask if preformed in loop because it needs to update every 5 seconds the new data. If i stop the task (condition = flase) the second one works perfectly.

First class:

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);
    }
}

}

Second class:

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);
    }


}
}

解决方案

After Android API 11, AsyncTasks started to run on serial executor by default, that means that only one task is running at a time. To get the behavior of prior to API 11, which is running on ThreadPoolExecutor, you'll need to specify it in the code like this:

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

Please take a look here for more information: http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html

Good luck!

P.S. It's not recommended to use AsyncTask for an infinite thread, AsyncTask purpose is to do a Task on the background, not to run forever, so if you want an infinite thread, I think you should create it as a Thread and not as an AsyncTask.

这篇关于在两个不同的类在执行了两个的AsyncTask在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆