Generic AsyncTask可用于任何Android版本

时间:2014-10-15 22:38:28

标签: android android-asynctask android-4.0-ice-cream-sandwich android-2.3-gingerbread

我正在制作一个Android应用程序"兼容"从2.3到4的任何Android版本......我想要完成的是制作一个从AsyncTask扩展的泛型类,可以用来处理后台不同的任务。我一直在阅读并找到了类似的工作:

AsyncTask task = new YourTask();
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
    task.execute(params);
} else {
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
}

我只是不想每次都需要使用AsyncTask来执行此操作.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)我应该使用executeOnExecutor以在支持它的任何东西上获得更好的性能而不是execute();

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {

                    new AsyncTask<Void, Void, Void>() {

                        @Override
                        protected Void doInBackground(Void... params) {
                            // Any task
                            return null;
                        }

                        @Override
                        protected void onPostExecute(Void aVoid) {
                            super.onPostExecute(aVoid);
                        }
                    }.execute();

                } else {

                    new AsyncTask<Void, Void, Void>() {

                        @Override
                        protected Void doInBackground(Void... params) {
                            //Any task
                            return null;
                        }

                        @Override
                        protected void onPostExecute(Void aVoid) {
                            super.onPostExecute(aVoid);

                        }
                    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);//This is the different thing.

                }

问题在于,并非所有任务都相同,因此参数会发生变化,而这些任务的结果也会发生变化。有人遇到同样的问题吗?任何推荐?

提前致谢。

1 个答案:

答案 0 :(得分:1)

将逻辑添加到重写的execute()方法。然后拨打YourTask.execute()

public final AsyncTask<Params, Progress, Result> execute(Params... params) {
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
        super.execute(params);
    } else {
        super.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    }
}