0

我在两个不同的类中有 2 个 AsyncTask,但问题是当第一个在背景状态下执行时,第二个没有执行。第一个 asyncTask 如果在循环中执行,因为它需要每 5 秒更新一次新数据。如果我停止任务(条件=flase),第二个工作完美。

一级:

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


}
}
4

3 回答 3

3

在 Android API 11 之后,AsyncTasks 默认开始在串行执行器上运行,这意味着一次只运行一个任务。要获得在 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

祝你好运!

PS 不建议AsyncTask用于无限线程,AsyncTask目的是在后台做一个任务,而不是永远运行,所以如果你想要一个无限线程,我认为你应该将它创建为 aThread而不是AsyncTask.

于 2013-01-08T21:15:49.620 回答
0

您的异步任务处于两个不同的活动中。任何时候只有一项活动处于活动状态。

于 2013-01-08T21:07:47.643 回答
-1

这两个类都扩展了 Activity,并且只有一个类同时运行。如果您希望任务的执行时间比活动的生命周期长,则必须将其包装到服务中

于 2013-01-08T21:10:17.210 回答