【问题标题】:How to get multiple implementations of a single AsyncTask class in Android?如何在 Android 中获取单个 AsyncTask 类的多个实现?
【发布时间】:2015-07-22 09:21:50
【问题描述】:

我正在开发一个 Android 应用程序,我的大部分活动都是通过 http 请求分别从 MySQL 数据库中获取内容。 为此,我需要为每个此类活动分别添加 AsyncTask 类。

是否有可能我可以使用一个通用的 AsyncTask 类来获取所有此类数据,并在活动中分别创建它们的对象并根据参数获取数据?

【问题讨论】:

  • 你可以创建一个扩展异步任务的内部类,然后在构造函数中你可以传递url和所需的参数

标签: android mysql android-asynctask


【解决方案1】:

当然,您可以创建扩展 AsyncTask 的单独类来发出 HTTP 请求,这将采用适当的参数并在许多活动中重用它。您不必在每个活动中创建嵌套的私有类。您可以在doInBackground(parameters) 方法中使用AsyncTask 的输入参数。请参阅AsyncTask 的文档:http://developer.android.com/reference/android/os/AsyncTask.html

在下面,您可以看到使用AsyncTask 和一些伪代码的非常简单的示例:

public class DownloadDataTask extends AsyncTask<String, Integer, String> {
  protected String doInBackground(String address) {
    // you should have method for performing HTTP request
    // and return result - in this case as String
    String result = performHttpRequest(address);
    return result;
  }    

  protected void onPostExecute(String result) {
    // this method is executed after downloading result
    // now, you can perform some action - e.g. display data in a TextView
    myTextView.setText(result);
  }
}

在这个定义中:AsyncTask&lt;String, Integer, String&gt;第一个参数是输入参数的类型(在这种情况下是端点的地址),第二个参数是进度值的类型(我们在这个例子中没有使用它),最后一个参数是输出值的类型(在我们的例子中,HTTP 响应为字符串)。

DownloadDataTask 类被放置在一个单独的文件中时,您可以通过以下调用在许多活动中重复使用它:

new DownloadDataTask().execute(address);

当然,这是带有一些伪代码的非常基本的示例。我还没有初始化TextView,也没有提供performHttpRequest() 方法的实现。您应该根据自己的需要进行调整。您还可以升级此解决方案并将引用传递给 TextView 或其他小部件,您的结果将在其中显示。

尽管如此,考虑使用 RxJava 和 RxAndroid 而不是 AsyncTask。它将使您的应用程序更简单,更不容易出错。我不推荐使用AsyncTask,因为我们现在有很多更好的安卓解决方案。不管这个事实如何,您可以决定在您的项目中使用哪种解决方案。

【讨论】:

  • 感谢您的帮助。由于我是新手,因此官方参考指南仍然有点压倒性。你能举个例子解释一下吗?
  • @HarshPoddar 我已经编辑了我的答案并添加了示例。我希望,现在很清楚了。
【解决方案2】:

您可以通过与使用任何其他 Class 几乎相同的方式来实现此目的 - 创建一个扩展 AsyncTask 的单独类文件并在需要的地方创建一个对象。

为了获得更大的灵活性,您可以声明类abstract 并使用未知类型参数,以便您可以根据需求的变化对其进行调整。

public abstract class MyTask<T> extends AsyncTask<T, Void, Void>{    

    @Override
    protected void onPreExecute() {
        Log.i("Tag", "onPreExecute");
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        Log.i("Tag", "onPostExecute");
    }
}

然后,无论何时你想创建一个实例:

MyTask<String> mt = null; //Or URL etc.    
//...
if (mt == null) {
    mt = new MyTask() {
        @Override
        protected Void doInBackground(String... params) {
            return null;
        }
    };
}
mt.execute(params);

【讨论】:

  • 这个技巧也不错。但我发现上述技术更适合我的应用程序
猜你喜欢
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 2014-09-24
  • 2017-01-12
相关资源
最近更新 更多