我有一个单独的 asynctask 类,它为我创建了一个 url。我尝试使用 onPostExecute 中的接口将 url 发送到我的片段,但无法管理它。通过强制在 onAttach 中实现接口,我总是在片段中执行相同的过程。
在 myTask.execute() 之后,我只需在屏幕上显示进度对话框即可等待结果。在调用接口的回调方法之前一切正常。(nullpointerexception)
如何强制片段使其实现接口?(我需要将数据直接发送到片段,而不是通过活动)
非常感谢您的宝贵时间。
我有一个单独的 asynctask 类,它为我创建了一个 url。我尝试使用 onPostExecute 中的接口将 url 发送到我的片段,但无法管理它。通过强制在 onAttach 中实现接口,我总是在片段中执行相同的过程。
在 myTask.execute() 之后,我只需在屏幕上显示进度对话框即可等待结果。在调用接口的回调方法之前一切正常。(nullpointerexception)
如何强制片段使其实现接口?(我需要将数据直接发送到片段,而不是通过活动)
非常感谢您的宝贵时间。
您可以尝试制作一个接口,并在您的 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) {
}
}
好吧,我终于发现了我的错误。正如 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。