【问题标题】:How to pass the name of the fragment to an Asynctask class?如何将片段的名称传递给 Asynctask 类?
【发布时间】:2017-01-20 06:55:58
【问题描述】:

我有这个类可以正常工作,但是因为我把片段的名称放在了我需要接收信息的地方...... 但是这个类会从多个片段中调用,所以我需要将名称作为参数传递,但我不知道如何传递它以及如何接收它。


这是我的异步类

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

}

【问题讨论】:

  • 为什么不在构造函数中传递呢?

标签: java android android-asynctask fragment parameter-passing


【解决方案1】:

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

  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();
    

现在每个片段可以使用相同的类并对结果做不同的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多