编程语言
首页 > 编程语言> > Android上的多线程处理程序的最佳实践是什么?

Android上的多线程处理程序的最佳实践是什么?

作者:互联网

我有一个应用程序,例如使用多个HTTPRequests

>获取会话ID
>获取一些locationdata
>获取现有类别
>(…)等等

我创建了一个HTTPRequestHandler,它基本上管理每个请求的所有AsynTasks ……这很有效,但我的问题是,我不知道管理不同的AsynTasks的好方法.例如,您需要先获取SessionId任务,然后才能启动GetSomeLocationData任务

所以在我的HTTPRequestHandler中,我有一个队列,它启动依赖AsyncTasks,如:

private void startSessionIdTask(...) {
    //...
    GetSessionIdTask mGetSessionIdTask = new GetSessionIdTask(this);
    mGetSessionIdTask.execute(url);
}

//and from the postExecute() in GetSessionIdTask I call
public void setSessionId(int mSessionId) {
    mDataHelper.setmSessionId(mSessionId); //set id


    String url = API_URL + API_GET_FAVORITES + URL_VARIABLE;

    List<NameValuePair> params = new LinkedList<NameValuePair>();
    params.add(new BasicNameValuePair("session_id", getSessionId()));
    String paramString = URLEncodedUtils.format(params, "utf-8");
    url += paramString;

    //and finally start another Tasks (and so one...)
    GetLocationsTask mGetLocationsTask = new GetLocationsTask(this);
    mGetSessionIdTask.execute(url);

}

但是,这样可以正常工作,但问题是,(取决于连接),此队列需要时间,并且用户可以启动其他失败的AsynTasks,因为某些最初的数据尚未加载.

我可以设置一些像isSessionIdLoaded这样的布尔值,或者可以为用户阻止UI,但我想知道,如果有更好的解决方案?!

所以我的问题是:有没有办法将asyntasks放在某种队列中(ArrayList,Map ..),它将连续执行?

解决方法:

从Android 3开始,AsyncTasks将在AsyncTask.SERIAL_EXECUTOR上串行执行.因此,默认情况下,如果启动2个AsyncTasks

task1.execute();
task2.execute();

只有在task1完成后才会执行Task2(只需检查AsyncTask.SERIAL_EXECUTOR的sdk实现).这可以推到这一点,如果task1由于任何原因永远不会完成,task2永远不会启动,你已经使你的应用程序陷入僵局.

如果您希望自己的队列与默认的SERIAL_EXECUTOR无关,请使用

public final AsyncTask<Params, Progress, Result> executeOnExecutor (Executor exec, Params... params)

并提供您自己的执行程序(aka线程池).对于一个项目,我将SERIAL_EXECUTOR实现复制为具有2个串行队列.

对于Android 2.3到1.6,默认情况下所有任务都是并行的,类似于在Android 3中调用:

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,null);

不幸的是,在Android 2.3及更低版本中,您无法指定将在其上运行任务/线程的执行程序.因此,如果您希望以串行方式完成它,则必须自己实现它,只有在task1在onPostExecute()中显式完成后才调用task2.当然可以推动这个概念使用任务队列,其中前任务在完成时将调用下一个任务(=串行工作队列).为此你会发现很多文学和模式.

标签:android,android-asynctask,android-handler
来源: https://codeday.me/bug/20190709/1409987.html