在同一类的不同实现之间进行选择

时间:2013-03-15 02:40:05

标签: java android android-asynctask android-compatibility

我不确定这是否可行,或者我是否正确地考虑了这一点。

Displaying Bitmaps Efficiently的Android开发者培训中,AsyncTask的自定义版本用于使代码与HONEYCOMB以下的Android版本兼容。

这篇出色的answer解释了前AsyncTask前后HONEYCOMB操作之间的差异。在指南中提供自定义版本的原因是,如果滚动HONEYCOMB图像,则java.util.concurrent.RejectedExecutionException(任务池)中的默认值很容易会因GridView而崩溃很快。对于这种情况,默认发布HONEYCOMB版本(在附加线程上执行串行)是必需的。

我可以通过在我的项目中使用更新版本的AsyncTask轻松完成此操作(就像在开发人员培训示例中所做的那样),但这与将来的更改不太兼容。

我想做的是以下内容:

  

如果版本为HONEYCOMB或更高版本,请使用。的实现   框架中提供了AsyncTask,如果是更早,请使用   我的申请中提供的AsyncTask实施。

这可能(以及如何)或者我应该以不同的方式思考它吗?

修改 我了解如何根据正在运行的SDK_VERSION提供条件。

我遇到的问题是AsyncTask是一个抽象类,这意味着我必须提供一个实现。 例如。我有AsyncTask名为myTask,其扩展名为AsyncTask,如下所示:

public class myTask extends AsyncTask<Void, Void, Void> {
    // Implementations for the abstract functions (doInBackground)
}

如何确定AsyncTask的哪个版本已扩展?

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

if(android.os.Build.VERSION.SDK_INT >= 11){ // Honeycomb
{
  AsyncTask taskObj = new DefaultAsyncTaskImpl();
  taskObj.execute();  
} else {
  AsyncTask taskObj = new CustomAsyncTaskImpl();
  taskObj.execute();
}

在您的代码中定义两个类,其中第一个扩展AsyncTask,第二个是您自己的实现

注意:API 4 +中提供了SDK_INT

修改

您可以使用factory design pattern根据SDK版本决定要创建哪个对象。

答案 1 :(得分:1)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            // Use built in AysncTask
        } else {
            // Use your AsyncTask
        }

您需要检查操作系统版本