【问题标题】:How to create reusable AsyncTasks in android?如何在 android 中创建可重用的 AsyncTasks?
【发布时间】:2015-01-05 22:37:03
【问题描述】:

我在 android 中有一个应用程序,我正在访问几个 REST web 服务。我正在使用 AsyncTasks 来访问这些并在之后进行一些 UI 更改。我想在不同的活动中使用其中一些调用。然而,根据我读过的所有教程,AsyncTasks 被用作活动中的内部类(这是有道理的,因为它们正在改变这些活动中的视图)。但是我怎样才能解决那些 AsyncTask 的可重用性呢?更重要的是,假设我想在位置更改时执行一些 AsyncTasks 调用。我有一个 LocationListener (它是一个外部类),我想在 onLocationChange() 方法内部进行 API 调用。但我无法访问我想要的视图,因为我不在活动课程中。有没有人有一个很好的解决方案或想法如何做类的架构?谢谢。

【问题讨论】:

  • 从 OO 的角度来看,您应该创建可重用的业务组件,而不是可重用的 AsyncTask。查看我的回答 here 了解更多详情。
  • 你是对的,但是,当我唯一需要的是 onPostExecute() 方法在不同活动中的不同实现时,它似乎重复了很多代码。
  • IMO 隔离 AsyncTask 要好得多,您不会获得任何真正的好处(可重用性、可测试性),而不是增加编码复杂性(传入和传出上下文引用)。从面向对象的角度谈代码重构时,更多地从问题抽象层面思考,而不是简单地从纯代码层面剥离内部类(AsyncTask、BaseAdapter 等)。如果你真的想简化你的代码,可以考虑使用超级Activity维护AsyncTask代码,这比创建AsyncTask作为单独的类要好。

标签: java android android-asynctask


【解决方案1】:

您可以将异步任务创建为单独的类,而不是集成到任何活动中。

示例代码如下:::

    public class KeyTask extends AsyncTask<Void, Void, String> {

    @Override 
    protected void onPreExecute() { 
        Log.i("onPreExecute", ".onPreExecute() — start");


    } 

    @Override 
    protected String doInBackground(Void ... params) {
        Log.i("TransmissionKeyTask", ".doInBackground() — start");

        }

    @Override
    protected void onPostExecute(String result) {
        Log.i("onPostExecute", ".onPostExecute() — start");
    }       
}

甚至你在其中添加构造函数,如下所示::

public KeyTask(Context context) {
        // TODO Auto-generated constructor stub

}

【讨论】:

  • 是的,可以这样做,但是如果我需要更改某些组件,我必须在 onPostExecute 方法中进行。如果该任务用于更多不同的活动,那可能是个问题。我认为这可以通过检查上下文的实例来完成(对吗?)在这种情况下,如何检查用户是否还没有导航到不同的活动?
  • 您可以使用枚举或 switch case 等等来区分,只是在调用这些任务时有一个构造函数并使用特定值调用来区分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多