2017-11-11 18 views
0

これは初めてのことです。私はいくつかのスレッドを読んだが、私はあなたの忍耐のために事前に感謝します!フラグメントと非同期タスク間の通信をコーディングする際の問題

フラグメント(frag1)で非同期タスクを起動します。タスクが完了していない間にユーザーが何かをしないようにしたいので、完了したタスクの%を通知して、ユーザーが通知を待つようにしたい。

は、私は、Java SetVal.javaでインタフェースを定義した:

interface SetVal { 
    void setVal(int val); 
} 

私の非同期タスクを:私はタスクにインターフェイスを渡す方法を知っているのに苦労してい

class AsyncCounter extends AsyncTask<Void, Integer, Void> { 
    private SetVal sender; 

    public AsyncCounter(SetVal sv){ 
     this.sender = sv; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     for(int i=0;i<60;i++){ 
      publishProgress(i); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     Log.i("ASYNC TASK","val: "+values[0]); 
     sender.setVal(values[0]); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
    } 

    public interface SetVal { 
     public void setVal(int val); 
    } 


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

。 私のコードは正しいですか? 非同期タスクをインスタンス化するにはどうすればよいですか?

フラグメント:

は、プライベートメソッドを作成してください:

public void onClick(View v) { 
    startMyAsync(); 
} 

private void startMyAsync() { 
    new AsyncCounter(this).execute(); 
} 

何を、なぜあなたがいることをやろうとしているが、あなたはフラグメントを渡すことができ

public class Frag1 extends android.app.Fragment implements SetVal { 
    private static TextView txt; 
    private int counter; 
    SetVal listener; 

    public Frag1() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.fragment_frag1, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     txt = (TextView) getActivity().findViewById(R.id.txt); 
     Button btn = (Button) getActivity().findViewById(R.id.btn1); 
     btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Log.i("Frag1", "val: " + counter); 
       if (counter > 0) return; 
       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
       Frag2 f2 = new Frag2(); 
       ft.replace(R.id.content_frame, f2); 
       ft.addToBackStack("f2"); 
       ft.commit(); 
      } 
     }); 

     Button btn2 = (Button) getActivity().findViewById(R.id.btn2); 
     btn2.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       AsyncCounter ac = new AsyncCounter(???????); 
       ac.execute(); 
      } 
     }); 

    } 

    @Override 
    public void setVal(int val) { 
     counter = val; 
    } 
} 

答えて

0

わかりません最後に:

public AsyncCounter(Frag1 context){ 
    this.sender = (SetVal)context; 
} 
+0

MyActivity is no私はContextを試してみましたが、java.lang.ClassCastExceptionがクラッシュしました。com.narb.nestedfragments.MainActivityはcom.narb.nestedfragments.AsyncCounter $ SetValにキャストできません。 – narb

+0

@narbダミーの名前を与えたためMyActivityは解決されません。それはあなたの断片を含む活動でなければなりません。更新された答え –

+0

を確認してください(これはコンテキストとアクティビティの両方で実行しています)、 "this.sender =(SetVal)context;を実行しようとするとクラッシュします。エラー:java.lang.ClassCastException:com.narb.nestedfragments.MainActivityをcom.narb.nestedfragments.AsyncCounter $ SetValにキャストできません – narb

関連する問題