Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何有效地使用异步任务_Android_Thread Safety_Android Asynctask - Fatal编程技术网

Android 如何有效地使用异步任务

Android 如何有效地使用异步任务,android,thread-safety,android-asynctask,Android,Thread Safety,Android Asynctask,我不熟悉安卓系统。我想问你们关于这项任务的事。我有一个活动显示项目(应用程序、歌曲、故事..)的详细信息。它需要许多相关数据,如屏幕截图、相关应用程序(歌曲、故事)等等。。。那么什么是Asynctask的最佳实现呢?我是为每个任务创建一个asynctask(例如:2个asynctask:1用于获取屏幕截图,1个用于获取相关项目…)还是将所有内容都放在doInBackGround中并发布进度 提前感谢。从面向对象的角度来看,业务逻辑应该始终与UI隔离。我会将所有业务调用(如getSong()、ge

我不熟悉安卓系统。我想问你们关于这项任务的事。我有一个活动显示项目(应用程序、歌曲、故事..)的详细信息。它需要许多相关数据,如屏幕截图、相关应用程序(歌曲、故事)等等。。。那么什么是Asynctask的最佳实现呢?我是为每个任务创建一个asynctask(例如:2个asynctask:1用于获取屏幕截图,1个用于获取相关项目…)还是将所有内容都放在doInBackGround中并发布进度


提前感谢。

从面向对象的角度来看,业务逻辑应该始终与UI隔离。我会将所有业务调用(如getSong()、getStore()等)隔离并集中到一个POJO中,并让我的活动类只关注UI操作/呈现,我就是这样做的:

  • 定义接口IBusinessDAO
  • 定义RealBusinessDAO实现IBusinessDAO
  • 定义MockBusinessDAO实现IBusinessDAO
  • 调用IBusinessDAO.getSong();AsyncTask.doInBackground()内部

    公共类MyActivity扩展活动{
    IBusinessDAO businessDAO;
    ... ...
    私有类MyAsyncTask扩展了AsyncTask{
    ... ...        
    受保护的void doInBackground(void…参数){
    businessDAO.getSong();
    }
    }
    ... ...
    创建时的公共void(Bundle savedInstanceState){
    if(runInTest)
    businessDAO=新的MockBusinessDAO();
    其他的
    businessDAO=新的RealBusinessDAO();
    新建myAsyncTask().execute();
    }
    }
    
  • 因此,在不同活动之间的每个AsyncTask实现中,AsyncTask.doinBackground()都将简单、干净,从而使代码更高效、更易于维护

    它还有助于提高代码的可测试性,对于您的业务逻辑进行单元测试,因为它是POJO,所以您可以使用纯JUnit编写测试用例。有时我们想要测试UI组件,我们并不真正关心底层业务逻辑是如何实现的,例如,我的业务逻辑连接到远程http服务器下载一些json数据,我不想每次都这样做,因为我只想测试UI布局,在这种情况下,我可以使用MockBusinessDAO(类似于Spring的DI概念)轻松地更改我的所有活动,以测试UI组件,而无需考虑实际业务逻辑是如何实现的

    最后,它还提高了代码的可重用性,因为您的businesDAO与Andriod无关,只是一个经典的POJO。此外,您不需要关心BusinessDAO实现中的任何并发性,因为它的所有方法都将在AsyncTask.doInBackground()方法中调用


    希望能有所帮助。

    我已经在一个异步任务中实现了此类任务

    private void _initCommonAsyncTask(AsyncTaskName currentTaskName,
            String searchQuery) {
        CommonAsyncTask task = new CommonAsyncTask(currentTaskName, searchQuery);
        task.execute();
        taskReference = new WeakReference<CommonAsyncTask>(task);
    }
    
    /**
     * Asynchronous Task for different functionalities.
     * 
     */
    private class CommonAsyncTask extends AsyncTask<Void, Void, Void> {
        private final String searchQuery;
        private AsyncTaskName currentTaskName;
    
        /**
         * Default constructor
         */
        public CommonAsyncTask(AsyncTaskName currentTaskName, String searchQuery) {
            super();
            this.searchQuery = searchQuery;
            this.currentTaskName = currentTaskName;
        }
    
        @Override
        protected void onPostExecute(Void result) {
            switch (currentTaskName) {
            case SEARCH:
                // Reinitialized the list view
                break; 
            case REFRESH:
                // Reinitialized the list view
                break;
            case LOAD_NEXT:
                // Reinitialized the list view
                break;
            default:
                break;
            }
            super.onPostExecute(result);
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
    
        @Override
        protected Void doInBackground(Void... params) {
            switch (currentTaskName) {
            case SEARCH:
                // My searching stuff here
                break;
            case REFRESH:
                // my refreshing stuff here
                break;  
            case LOAD_NEXT:
                //my load next 50 orders here
                break;  
            default:
                break;
            }
            return null;
        }
    }
    
    在枚举中定义任务列表,如下所示

    public enum AsyncTaskName {
        SEARCH, REFRESH, LOAD_NEXT;
    }
    

    对于您的任务,最好使用ready-ready libs:谢谢,我已经在我的应用程序中使用了谷歌电视的imageloader:DMay be我没有解释清楚。我的应用程序很喜欢安卓市场。例如:在详细的应用程序活动中,它显示应用程序屏幕截图、同一类别应用程序、同一提供商应用程序、推荐应用程序。所以我创建了4个asynctask来获取数据,或者将4个函数放在一个asynctask中,并通过调用publishProgress来更新UI。哪种方法更有效。我读过不同的歌曲,应用程序,故事模型。。。和伪造数据:我个人更喜欢使用publishProgress的单个异步任务,只要所有耗时的任务都在后台线程中处理,使用一个任务就足够了,而且比使用多个任务更有效。
    _initCommonAsyncTask(AsyncTaskName.SEARCH, searchQuery);
    
    public enum AsyncTaskName {
        SEARCH, REFRESH, LOAD_NEXT;
    }