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;
}
}
MyActivity is no私はContextを試してみましたが、java.lang.ClassCastExceptionがクラッシュしました。com.narb.nestedfragments.MainActivityはcom.narb.nestedfragments.AsyncCounter $ SetValにキャストできません。 – narb
@narbダミーの名前を与えたためMyActivityは解決されません。それはあなたの断片を含む活動でなければなりません。更新された答え –
を確認してください(これはコンテキストとアクティビティの両方で実行しています)、 "this.sender =(SetVal)context;を実行しようとするとクラッシュします。エラー:java.lang.ClassCastException:com.narb.nestedfragments.MainActivityをcom.narb.nestedfragments.AsyncCounter $ SetValにキャストできません – narb