首先,这是一个很好的做法,从异步任务访问片段的方法吗?
我有一个异步任务,它生成一个LatLng列表,在我的片段中使用它来绘制折线。但是,如果我尝试使用getter方法来获取列表。
public List<LatLng> getList() {
return this.list;
}
我得到nullpointerexceptions
所以我必须在片段中执行此操作,
while(list == null) { // FIXME delay because of this
list = getRoute.getList();
}
这违背了后台任务的目的。
有没有办法可以在异步任务的post执行方法中调用该方法?
@Override
protected void onPostExecute(OTPResponseUI otpResponse) {
Fragment.fragmentsMethod(getList());
mDialog.dismiss();
}
通过这种方式,我可以正确显示进程对话框,并且在加载列表时不会让用户挂起。
更新 我尝试调用像this这样的回调,但我的片段中的回调函数没有被执行。
UPDATE2 好吧,我只是将片段实例传递给异步任务,以便能够调用片段方法。根据你的建议:
在自定义AsyncTask类中创建列表对象,然后将其返回到postExecute()方法中的Fragment。您可以通过直接调用Fragment实例上的方法来实现此目的(您可以通过构造函数获取该方法。它可以工作,谢谢!
答案 0 :(得分:1)
您有几个选择:
定义您自己的自定义AsyncTask
类,并将您想要填充的List
传递给其构造函数:
class MyAsyncTask extends AsyncTask<Void,Void,Void> {
private List<LatLng> mTheList;
public MyAsyncTask(List<LatLng> theList) {
mTheList = theList;
}
// fill the list in doInBackground()
...
}
// in your fragment
MyAsyncTask task = new MyAsyncTask(theList);
task.execute();
OR 您可以将其作为参数传递给execute()
方法:
class MyAsyncTask extends AsyncTask<List<LatLng>,Void,Void> {
public Void doInBackgroun(List<LatLng>...args {
List<LatLng> theList = args[0];
// fill the list
}
}
请注意,您也可以以相同的方式将Fragment
实例传递给execute()
方法,然后在该实例上调用getList()
方法(我不喜欢此选项)
更好的选择是:
在自定义AsyncTask
课程中创建列表对象,然后将其返回Fragment
方法中的postExecute()
。您可以通过直接调用Fragment
实例上的方法(您将通过构造函数或作为execute()
方法的参数获取)接受列表作为参数来实现此操作。但是,另一种(更干净的)方法是在自定义AsyncTask
类中定义一个接口,该接口接受填充列表作为参数。然后你的Fragment
可以实现这个回调接口,将自己作为“监听器”添加到任务中,并让任务调用inteface方法,将填充的列表作为任务的postExecute()
方法中的一个agrument传递。