Asynctask重度使用

AsyncTask被devise成围绕Thread和Handler的助手类,并不构成通用的线程框架。 理想情况下,AsyncTasks应该用于短操作(最多几秒钟)。

这就是它在文档中所说的。

说networking语言,“几秒钟”多久?

我的应用程序将执行以下操作,从数据库获取数组列表,发送到服务器,获取另一个列表(json),发送一个好的,它收到列表,parsingjsons,在db中插入列表,做一些其他的进程分贝,更新用户界面(该列表可以达到5000-1000条目的对象实例。)

使用asynctask这样的东西是一个好主意? 我也需要根据服务器响应的结果来更新gui。

如果不是,我还有其他的select吗?

Solutions Collecting From Web of "Asynctask重度使用"

我已经做了类似于你的事情。 我已经下载了一堆图像(大约5000),将其保存在SD卡中,并将一行保存在数据库中。 我已经使用asynchronous任务没有问题,我没有看到使用它的问题。 我build议您使用进度条向用户显示应用程序正在执行的操作以及取消任务的选项(AsyncTask提供取消机制)

看到这个答案: 长期运行操作的AsyncTask

总而言之,长期运行的AsyncTasks可能由于其实现而造成内存泄漏。 它也可能导致方向变化的问题。

这就是我所理解的。 实际上AsyncTask主要与UI相关。例如OnPostExecute在UI线程中执行。

所以在我的理解中,如果用户可以合理地等待操作的结束,那么可以安全地使用AsyncTask。

要知道你的任务是否符合条件,最好的办法就是试试看。

关于屏幕取向:

在阅读本页面的答案之后,我意识到我的应用程序在运行AsyncTask时无法处理方向更改。

这是我解决这个问题的方法:

@Override protected void onPreExecute() { Device.lockOrientation((Activity)context); ... } @Override protected void onPostExecute(List<Hydrant> hydrants) { Device.releaseOrientation((Activity)context); ... } 

设备实现:

 public class Device { public static void lockOrientation(Activity activity) { Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); int rotation = display.getRotation(); int tempOrientation = activity.getResources().getConfiguration().orientation; int orientation = 0; switch(tempOrientation) { case Configuration.ORIENTATION_LANDSCAPE: if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; else orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; case Configuration.ORIENTATION_PORTRAIT: if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270) orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; else orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; } activity.setRequestedOrientation(orientation); } public static void releaseOrientation(Activity activity) { activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); } } 

由于AsyncTasks只能运行几秒钟,所以这对我来说是可以接受的解决scheme,因为这很less会影响用户。 特别是有一些ProgressDialog作为一个很好的指示,她将不得不等待多久。