如何在Android中获得单个AsyncTask类的多个实现?

时间:2015-07-22 09:21:50

标签: android mysql android-asynctask

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

是否有可能在所有此类数据获取中使用通用的AsyncTask类,并在活动中单独创建对象并根据参数获取数据?

2 个答案:

答案 0 :(得分:0)

当然,您可以创建单独的类扩展AsyncTask来发出HTTP请求,这将采用适当的参数并在许多活动中重用它。您不必在每个活动中创建嵌套的私有类。您可以在AsyncTask方法中使用doInBackground(parameters)的输入参数。请参阅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<String, Integer, String>第一个参数是输入参数的类型(在这种情况下是终点的地址),第二个参数是进度值的类型(我们在这个例子中没有使用它),最后一个参数参数是输出值的类型(在我们的例子中,HTTP响应为String)。

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

new DownloadDataTask().execute(address);

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

然而,考虑使用RxJava 和RxAndroid而不是AsyncTask。它将使您的应用程序更简单,更不容易出错。我不建议使用AsyncTask,因为我们现在有很多更好的Android解决方案。无论这个事实如何,您都可以决定在项目中使用哪种解决方案。

答案 1 :(得分:0)

您可以像使用任何其他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);