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