从异步任务访问片段方法

时间:2013-08-26 13:54:50

标签: android

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

我有一个异步任务,它生成一个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实例上的方法来实现此目的(您可以通过构造函数获取该方法。它可以工作,谢谢!

1 个答案:

答案 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传递。