【问题标题】:Choose between different implementations of the same class在同一类的不同实现之间进行选择
【发布时间】:2013-03-15 02:40:05
【问题描述】:

我不确定这是否可行,或者我的想法是否正确。

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

这个伟大的answer 解释了AsyncTask 前后HONEYCOMB 操作之间的区别。指南中提供自定义版本的原因是,如果快速滚动图像的GridView,pre HONEYCOMB(任务池)中的默认值将很容易因java.util.concurrent.RejectedExecutionException 而崩溃。对于这种情况,需要默认的 postHONEYCOMB 版本(在附加线程上串行执行)。

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

我想做的是:

如果版本是HONEYCOMB或更高版本,使用实现 框架中提供了AsyncTask,如果更早,则使用 我的应用程序中提供的AsyncTask 实现。

这可能(以及如何)还是我应该以不同的方式考虑?

编辑: 我了解如何根据正在运行的SDK_VERSION 提供条件。

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

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

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

【问题讨论】:

    标签: java android android-asynctask android-compatibility


    【解决方案1】:

    你可以这样做:

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

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

    注意:SDK_INT 在 API 4+ 中可用

    编辑:

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

    【讨论】:

    • 查看编辑。这表明我担心的是,为我的整个应用程序中的每个 AsyncTask 类提供单独的实现。另外,该代码示例不会返回两个不同的对象,因此所有代码都必须处理不同对象类型的情况吗?
    • *for each custom AsyncTask class (like myTask) 是我的意思
    • 您可以使用Factory design pattern根据SDK版本决定创建哪个对象。
    • 谢谢! Factory design pattern 正是我正在寻找的。如果可能的话,您能否将其包含在答案中,以便其他人在寻找时可以找到它?再次感谢
    【解决方案2】:
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                // Use built in AysncTask
            } else {
                // Use your AsyncTask
            }
    

    您需要检查操作系统版本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多