2016-09-12 11 views
-1

私はこのクラスをうまく使っていますが、情報を受け取る必要がある部分の名前を入れているので... しかし、このクラスは複数のフラグメントから呼び出されるので、名前を渡す必要がありますパラメータを渡す方法とそれを受け取る方法はわかりません。フラグメントの名前をAsynctaskクラスに渡すにはどうすればいいですか?


これは私の非同期クラスです

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

} 
+0

なぜそれをコンストラクタに渡さないのですか? – Shaishav

答えて

0

です。このようにしてください:

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

今、各断片は同じクラスを使用して、結果と異なることを行うことができますを開始します。

関連する問題