1

首先,这是一个好习惯,从异步任务访问片段的方法吗?

我有一个异步任务,它生成一个 LatLng 列表,在我的片段中用于绘制折线。但是,如果我尝试使用 getter 方法来获取列表。

    public List<LatLng> getList() {
    return this.list;
}

我明白nullpointerexceptions了,所以我必须在片段中执行此操作,

while(list == null) { // FIXME delay because of this 
    list = getRoute.getList();
}   

这违背了拥有后台任务的目的。

有没有办法可以从异步任务的后执行方法中调用该方法?

    @Override
protected void onPostExecute(OTPResponseUI otpResponse) {
            Fragment.fragmentsMethod(getList());
            mDialog.dismiss();
    }

这样我就可以正确显示进程对话框,并且在加载列表时不会让用户挂起。

更新 我尝试调用这样回调,但我的片段中的回调函数没有执行。

UPDATE2 好的,我刚刚将片段实例传递给异步任务,以便能够调用片段方法。根据您的建议:

在您的自定义 AsyncTask 类中创建列表对象,然后在 postExecute() 方法中将其返回给 Fragment。您可以通过直接调用 Fragment 实例上的方法来执行此操作(您将通过构造函数获得。它有效,谢谢!

4

1 回答 1

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();

或者您可以将其作为参数传递给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可以实现这个回调接口,将自己作为“侦听器”添加到任务中,并让任务调用该接口方法,将填充的列表作为任务方法中的 agrument 传递postExecute()

于 2013-08-26T14:51:46.960 回答