Android 异步任务大量使用
AsyncTask被设计成一个围绕线程和处理程序的助手类,并不构成通用线程框架。 AsyncTasks最好用于短期操作(几秒钟 顶多。) 这就是它在文档中所说的 说网络语言,‘几秒钟’有多长 我的应用程序将执行以下操作:从DB获取数组列表,将其发送到服务器,获取另一个列表(json),发送一个确认它收到了该列表,解析json,将该列表插入DB,在DB中执行一些其他过程,更新UI。。(列表最多可包含5000-1000个对象实例条目。) 对这些东西使用asynctask是个好主意吗?我还需要根据服务器响应的结果更新guiAndroid 异步任务大量使用,android,android-asynctask,Android,Android Asynctask,AsyncTask被设计成一个围绕线程和处理程序的助手类,并不构成通用线程框架。 AsyncTasks最好用于短期操作(几秒钟 顶多。) 这就是它在文档中所说的 说网络语言,‘几秒钟’有多长 我的应用程序将执行以下操作:从DB获取数组列表,将其发送到服务器,获取另一个列表(json),发送一个确认它收到了该列表,解析json,将该列表插入DB,在DB中执行一些其他过程,更新UI。。(列表最多可包含5000-1000个对象实例条目。) 对这些东西使用asynctask是个好主意吗?我还需要根据服务
如果没有,我还有其他选择吗?我已经做过类似的事情了。我下载了一堆图像(大约5000张),保存在SD卡中,并在数据库中保存了一行。 我使用了异步任务,没有任何问题,而且我认为使用它没有问题。我建议您使用进度条向用户显示应用程序正在执行的操作,并带有取消任务的选项(AsyncTask提供了一种取消机制)请参见以下答案: 总之,长期运行的异步任务可能由于其实现而导致内存泄漏。它还可能导致方向改变问题。这就是我的理解。 事实上,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);
...
}
由于AsyncTasks只能运行几秒钟,这是我可以接受的解决方案,因为这很少会影响用户。特别是在一段对话中,她很好地指出了她需要等待多长时间 好的@ACDias,看起来很有希望,,据我所知,asynctask可以处理我将要执行的任务量,因为我的任务量只是文本,而不是图像。少数任务量很少超过一个数量级。您描述的内容似乎很长,这意味着您将让用户退出活动,并期望在后台完成治疗。异步任务在这里似乎不合适。I+1 gunar和推荐及意向服务该死的“少数人很少超过一个数量级”是什么意思?这将在后台无声完成,用户不会离开应用程序@njzk2“很少有几个数量级超过一个数量级”=>比如10左右。我知道,除此之外,用户往往会以这样或那样的方式退出应用程序,这将导致问题,从你的线程被终止到你的活动被泄露的上下文。意向服务在您的情况下更合适。
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);
}
}