2013-03-15 63 views
2

我不确定这是否可行,或者我是否正确地考虑了这一点。在同一类的不同实现之间进行选择

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

这个伟大的answer解释了在HONEYCOMB之前和之后AsyncTask操作之间的差异。本指南中提供定制版本的原因是,如果GridView图像快速滚动,HONEYCOMB(任务池)中的默认值将很容易与java.util.concurrent.RejectedExecutionException相撞。在这种情况下,默认的帖子HONEYCOMB版本(在附加线程上的串行执行)是必需的。

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

我想什么做的是以下几点:

如果版本HONEYCOMB或更高,使用该框架提供的 AsyncTask实施,而如果较早,使用 的AsyncTask在我的应用程序中提供的实现。

这是可能的(以及如何)或应该不同地考虑它?

编辑: 我明白如何提供基于运行SDK_VERSION条件。

我遇到的问题是AsyncTask是一个抽象类,这意味着我必须提供一个实现。 例如我有一个名为AsyncTaskmyTask延伸AsyncTask象下面这样:

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

如何决定哪些AsyncTask版本扩展?

回答

2

你可以这样做:

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版本决定创建哪个对象。

+0

请参阅编辑。这表明我很害怕,为我的整个应用程序中的每个'AsyncTask'类提供单独的实现。此外,不会代码示例返回两个不同的对象,所以所有的代码将不得不处理不同的对象类型的情况? – 2013-03-15 03:45:10

+0

*对于每个定制的'AsyncTask'类(就像'myTask')是我的意思 – 2013-03-15 03:59:07

+0

您可以使用'工厂设计模式'来决定基于SDK版本创建哪个对象。 – iTech 2013-03-15 04:02:40

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

你需要检查操作系统版本