Asynctask大量使用

时间:2013-09-24 15:27:04

标签: android android-asynctask

  

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

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

说网络语言,“几秒钟”多长时间?

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

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

如果不是,我还有其他选择吗?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

请参阅此答案:AsyncTask for long running operations

总之,长时间运行的AsyncTasks会因其实现而产生内存泄漏。它也可能导致方向更改问题。

答案 2 :(得分:1)

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

因此,根据我的理解,如果用户可以合理地等待操作结束,您可以安全地使用AsyncTask。

了解您的任务是否符合条件的最佳方法是尝试。

答案 3 :(得分:0)

关于屏幕方向:

在阅读此页面上的答案后,我意识到我的应用无法在运行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只能运行几秒钟,这对我来说是一个可以接受的解决方案,因为这很少会影响用户。特别是像ProgressDialog这样的东西可以很好地表明她需要等多久。