我正在开发一个 Android 应用程序,我的大部分活动都是通过 http 请求分别从 MySQL 数据库中提取内容。 为此,我需要将 AsyncTask 类分别添加到每个此类活动中。
是否有可能在所有此类数据获取中使用通用的AsyncTask类,并在活动中单独创建对象并根据参数获取数据?
答案 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);