[英]How to pass the name of the fragment to an Asynctask class?
我有这个类可以正常工作,但是因为我将 Fragment 的名称放在我需要接收信息的地方...但是这个类将从多个片段调用,所以我需要将名称作为参数传递,但是我不知道如何通过它以及如何接收它。
这是我的异步类
public class AsyncFragment extends AsyncTask<String, Void, String> {
SubirFotos container;
public AsyncFragment(SubirFotos f) {
this.container = f;
}
@Override
protected String doInBackground(String... params) {
try {
Thread.sleep(3000); // This takes 3 seconds
}catch(Exception ex) {}
return "DNI activo "+params[0]+ " " + params[1];
}
@Override
protected void onPreExecute() {
super.onPreExecute();
container.showProgressBar();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// The activity can be null if it is thrown out by Android while task is running!
if(container!=null && container.getActivity()!=null) {
container.populateResult(result);
container.hideProgressBar();
this.container = null;
}
}
}
这是我的片段
public class SubirFotos extends Fragment {
private String userDNI;
private TextView textView;
View view;
String mResult;
AsyncFragment mTask;
public SubirFotos() {}
//El Fragment ha sido creado
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view= inflater.inflate(R.layout.fragment_subirfotos, container, false);
// on configuration changes (screen rotation) we want fragment member variables to preserved
setRetainInstance(true);
return view;
}
//La vista de layout ha sido creada y ya está disponible
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
//La vista ha sido creada y cualquier configuración guardada está cargada
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
}
//El Activity que contiene el Fragment ha terminado su creación
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle bundle = getArguments();
userDNI = bundle.getString("userdni");
textView =(TextView)getView().findViewById(R.id.textView);
ejecutarAsync(userDNI);
if(isTaskRunning(mTask)) {
showProgressBar();
}else {
hideProgressBar();
}
if(mResult!=null) {
populateResult(mResult);
}
super.onActivityCreated(savedInstanceState);
}
//El Fragment ha sido quitado de su Activity y ya no está disponible
@Override
public void onDetach() {
super.onDetach();
}
protected void ejecutarAsync(String dato) {
mTask = new AsyncFragment(this);
mTask.execute(dato );
}
public void showProgressBar() {
TextView resultView = (TextView)getActivity().findViewById(R.id.textUrlContent);
resultView.setVisibility(View.GONE);
ProgressBar progress = (ProgressBar)getActivity().findViewById(R.id.progressBarFetch);
progress.setVisibility(View.VISIBLE);
progress.setIndeterminate(true);
}
public void hideProgressBar() {
TextView resultView = (TextView)getActivity().findViewById(R.id.textUrlContent);
resultView.setVisibility(View.VISIBLE);
ProgressBar progress = (ProgressBar)getActivity().findViewById(R.id.progressBarFetch);
progress.setVisibility(View.GONE);
}
public void populateResult(String s) {
TextView resultView = (TextView)getActivity().findViewById(R.id.textUrlContent);
resultView.setText(s);
}
protected boolean isTaskRunning(AsyncFragment task) {
if(task==null ) {
return false;
} else if(task.getStatus() == AsyncFragment.Status.FINISHED){
return false;
} else {
return true;
}
}
}
不要传递片段名称或引用。 像这样做:
为AsyncTask
子类的客户端创建一个接口。 这个接口可以在AsyncTask
子类中。
interface OnResultsListener { public void onResults(String results); }
该类应该引用此侦听器。
private OnResultsListener mListener;
在类的构造函数中设置引用。
public MyAsyncTask(OnResultsListener listener) { mListener = listener; }
完成时调用侦听器的方法:
@Override protected void onPostExecute(String result) { if (mListener != null) { mListener.onResults(result); } }
那个“控制反转”或“依赖注入”的东西? 你刚刚做到了。
您的客户将创建侦听器并启动任务
OnResultsListener listener = new MyAsyncTask.OnResultsListener() { @Override public void onResults(String results) { // here you do the stuff you want to do with the results } }; new MyAsyncTask(listener).execute();
现在每个片段都可以使用相同的类并使用结果做不同的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.