编码碎片和异步任务之间的通信问题

编码碎片和异步任务之间的通信问题

问题描述:

我对这个概念很陌生。我读了几个线程,但我阻止,所以先感谢您的耐心!编码碎片和异步任务之间的通信问题

在一个片段(frag1)中,我启动一个异步任务。我想阻止用户在任务未完成时做任何事情,因此我想传达完成的任务的百分比,以便用户等待通知。

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; 
    } 
} 

我挣扎,知道如何将接口传递给任务:

我在一个Java SetVal.java定义的接口:

interface SetVal { 
    void setVal(int val); 
} 

我的异步任务。 我的代码是否正确? 如何实例化异步任务?

片段:

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; 
    } 
} 

不知道什么,为什么你想这样做,但你可以通过片段:

尝试创建一个私有方法:

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

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

最后:

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

MyActivity is no解决所以我尝试与上下文,但它坠毁java.lang.ClassCastException com.narb.nestedfragments.MainActivity不能转换为com.narb.nestedfragments.AsyncCounter $ SetVal – narb

+0

@narb MyActivity未解决,因为我只是给了一个虚拟名称。它应该是包含你的片段的活动。检查我已经完成的更新回答 –

+0

(包括Context和Activity),并且在尝试执行“this.sender =(SetVal)context”时崩溃了;“与错误java.lang.ClassCastException:com.narb.nestedfragments.MainActivity无法转换为com.narb.nestedfragments.AsyncCounter $ SetVal – narb