我有一个包含一些数据的XML文件,所以我创建了一个代表它的类:
public class MyData
{
ArrayList<SpecialData> list;
int currentPage, totalPages;
}
您可以猜测我有一个SpecialData
项列表,每个项都包含许多字段,而currentPage
/ totalPages
是XML文件中的两个唯一值。我需要异步地获取和解析XML文件,所以我创建了这个类:
class GetXMLTask extends AsyncTask<String, Void, MyData>
{
@Override
protected MyData doInBackground(String... params)
{
MyData md = null;
// Getting/parsing data
return md;
}
}
我试了一下,问题不是来自这里,因为我正确地解析了我的XML文件,而我的MyData
对象是完美的。但是我在我的主要Activity
类中使用了这个任务:
MyData md = null;
GetXMLTask task = new GetXMLTask(this);
task.execute(new String[]{url});
// How can this change my md object?
这可能非常愚蠢,但我根本不知道如何将我的MyData
实例从我的主类链接到我用AsyncTask
获得的实例。我该怎么办?感谢。
答案 0 :(得分:6)
覆盖AsyncTask
的{{1}}方法:
onPostExecute
请注意,这假设您的AsyncTask是您的活动的内部类。如果不是这种情况,您可以将构造函数中对Activity的引用传递给AsyncTask。在这些情况下,您应该小心使用protected void onPostExecute(MyData result) {
md = result;
}
来激活您的活动,以防止资源泄漏:
WeakReference
答案 1 :(得分:2)
您可能希望实现某种回调。这样就可以避免公开数据暴露,并且可以实现其他回调(例如,如果加载数据时出现问题,则会出现错误回调)。
例如,您可以定义如下界面:
interface MyAsyncFinishedLister {
void onFinished(MyData resultData);
}
您的AsyncTask将有一个MyAsyncFinishedListener实例,您可以调用onPostExecute:
protected void onPostExecute(MyData result) {
myAsyncFinishedListener.onFinished(result);
}
您的主要活动将实现此界面,如下所示:
class MyActivity extends Activity implements MyAsyncFinishedListener {
MyData md;
public void onCreate() {
super.onCreate();
GetXMLTask task = new GetXMLTask(this);
task.execute(new String[]{url});
task.setOnFinishedListener(this);
}
onFinished(MyData result) {
md = result;
}
}
答案 2 :(得分:1)
如果希望AsyncTask返回数据对象,则需要将其存储在类范围中的变量中,而不是函数范围中。为了简化这一过程,任务通常是私有的内部类。
答案 3 :(得分:1)
将MyData
声明为整个类可见的变量,并尝试通过将结果分配给MyData变量来在 onPostExecute()
中访问它