编码碎片和异步任务之间的通信问题
问题描述:
我对这个概念很陌生。我读了几个线程,但我阻止,所以先感谢您的耐心!编码碎片和异步任务之间的通信问题
在一个片段(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;
}
MyActivity is no解决所以我尝试与上下文,但它坠毁java.lang.ClassCastException com.narb.nestedfragments.MainActivity不能转换为com.narb.nestedfragments.AsyncCounter $ SetVal – narb
@narb MyActivity未解决,因为我只是给了一个虚拟名称。它应该是包含你的片段的活动。检查我已经完成的更新回答 –
(包括Context和Activity),并且在尝试执行“this.sender =(SetVal)context”时崩溃了;“与错误java.lang.ClassCastException:com.narb.nestedfragments.MainActivity无法转换为com.narb.nestedfragments.AsyncCounter $ SetVal – narb