1

我有一个单独的 asynctask 类,它为我创建了一个 url。我尝试使用 onPostExecute 中的接口将 url 发送到我的片段,但无法管理它。通过强制在 onAttach 中实现接口,我总​​是在片段中执行相同的过程。

在 myTask.execute() 之后,我只需在屏幕上显示进度对话框即可等待结果。在调用接口的回调方法之前一切正常。(nullpointerexception)

如何强制片段使其实现接口?(我需要将数据直接发送到片段,而不是通过活动)

非常感谢您的宝贵时间。

4

2 回答 2

2

您可以尝试制作一个接口,并在您的 asynctask 中有一个方法或构造函数来接受所述侦听器。

在您的片段中创建侦听器并为您设置异步任务。

public class Example extends AsyncTask<Void, Void, Void> {
AsyncListener listener;
Object result;

@Override
protected Void doInBackground(Void... params) {
    return null;
}

@Override
protected void onPostExecute(Void result) {
    this.result = result;
    super.onPostExecute(result);
    if(listener != null)
        listener.onComplete(result);
}

public void setListener(AsyncListener listener) {
    this.listener = listener;
}

public Object getResult() {
    return result;
}

public interface AsyncListener {
    public void onComplete(Object object);
}
}

public class ExampleFragment extends Fragment implements AsyncListener {
private Example task;

public static ExampleFragment newInstance(Example task) {
    this.task = task;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Object object;
    if((object = task.getResult()) == null)
        task.setListener(listener);
    else
        onComplete(object);

    return super.onCreateView(inflater, container, savedInstanceState);
}

public void onComplete(Object object) {

}
}
于 2013-02-04T16:19:43.707 回答
0

好吧,我终于发现了我的错误。正如 ePeace 在他的回答中提到的那样。在我的 Asyntask 类中,我创建了一个构造函数,它抛出 nullpointerexception 是侦听器为空。

AsyncListener listener;
public ReportFactory(AsyncListener a)
{
    if(a == null)
    {
        throw new NullPointerException("Listener cant be null");
    }

    this.setListener(a);
}

public interface AsyncListener {
    public void onComplete(String url);
}


public void setListener(AsyncListener listener) {
    this.listener = listener;
}

之后,在片段类中,我创建了一个监听器。(在类中有一个对监听器的全局引用,这样你就可以在片段生命周期的其他地方使用它)

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

  listener = new AsyncListener()
{

    @Override
    public void onComplete(String url)
    {
        URL = url;          
        webview.loadUrl(URL);         
    }
};      
}

最后,在 onCreate 方法中,我创建了我的 Asyntask 并将侦听器作为参数。

ReportFactory factory = new ReportFactory(listener);
factory.execute(usr, designFile);     

希望它对以后可能需要它的你有用。非常感谢您抽出时间 ePeace。

于 2013-02-05T10:19:20.040 回答