繁体   English   中英

如何将片段的名称传递给 Asynctask 类?

[英]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;
        }
    }

}

不要传递片段名称或引用。 像这样做:

  1. AsyncTask子类的客户端创建一个接口。 这个接口可以在AsyncTask子类中。

     interface OnResultsListener { public void onResults(String results); }
  2. 该类应该引用此侦听器。

     private OnResultsListener mListener;
  3. 在类的构造函数中设置引用。

     public MyAsyncTask(OnResultsListener listener) { mListener = listener; }
  4. 完成时调用侦听器的方法:

     @Override protected void onPostExecute(String result) { if (mListener != null) { mListener.onResults(result); } }

    那个“控制反转”或“依赖注入”的东西? 你刚刚做到了。

  5. 您的客户将创建侦听器并启动任务

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM