1

別の非同期タスククラスがあり、URLを作成します。onPostExecuteのインターフェイスを使用してURLをフラグメントに送信しようとしましたが、管理できませんでした。onAttachにインターフェイスを実装するように強制することで、フラグメントで常に同じプロセスを実行していました。

myTask.execute()の後、画面に進行状況ダイアログが表示された結果を待つだけです。インターフェイスのコールバックメソッドが呼び出されるまで、すべてが正常に機能します。(nullpointerexception)

フラグメントにインターフェイスを実装させるにはどうすればよいですか?(アクティビティを介さずに、データをフラグメントに直接送信する必要があります)

お時間をいただき、誠にありがとうございます。

4

2 に答える 2

2

インターフェイスを作成して、上記のリスナーを受け入れるメソッドまたはコンストラクターを asynctask に含めることができます。

フラグメントにリスナーを作成し、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クラスで、リスナーがnullである場合に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 に答える