7

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

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

说网络语言,“几秒钟”是多久?

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

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

如果没有,我还有什么其他选择?

4

4 回答 4

4

我已经做过和你类似的事情了。我已经下载了一堆图像(大约 5000 张),将其保存在 SD 卡中,并在数据库中保存了一行。我已经毫无问题地使用了异步任务,并且我认为使用它没有问题。我建议您使用进度条向用户显示 App 正在执行的操作以及取消任务的选项(AsyncTask 提供了取消机制)

于 2013-09-24T15:34:41.197 回答
3

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

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

于 2013-09-24T15:37:44.313 回答
1

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

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

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

于 2013-09-24T15:40:50.850 回答
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 这样的东西,可以很好地表明她必须等待多长时间。

于 2013-09-26T20:56:15.970 回答