2016-04-20 12 views
0

ボタンのコールバックアクションをメインアクティビティからAsyncTaskクラスに渡そうとしています。今の私はちょうどAsyncTaskクラスのコンストラクタでボタンを渡し、私はそこにそれを直接実行します。ButtonコールバックアクションをAsyncTaskクラスに渡すにはどうすればいいですか?

public AsyncTaskClass(Button btnOk){ 
    this.btnOk = btnOk; 
} 

@Override 
protected void onPreExecute() { 
    btnOk.setOnClickListener(btnOkListener); 
    Log.i("AsyncTask", "onPreExecute"); 
} 

private View.OnClickListener btnOkListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     //things to do 
    } 
}; 

@Override 
protected Boolean doInBackground(Void... params) { //etc 

はこのことをお勧めますか?おそらく、外部コールバックインターフェイスを使用して、それを行う良い方法はありますか?もしそうなら、どうやって作ることができますか?あなたの時間をありがとう!

+0

なぜですか?あなたのボタンをクラスのクラスメンバーとして宣言できればもっと簡単になるでしょう – AADProgramming

+0

3つのパラメータを持つAsyncTaskクラスを拡張せずにAsyncTaskClassを使用する方法 –

+0

@DemoMailおそらくこれはクラスの簡単な本体ですクラス宣言自体はここにはありません。 – Pooya

答えて

0

スレッドにパラメータとしてビュー、フラグメント、アクティビティなどを渡すことは決してありません。 Androidのライフサイクルは、UIコンテナに関連しないビューのインスタンスのような厄介な驚きを、スタックから他のものに置き換えているので、驚かせることができます。とにかく、clickイベントからのコールバックは常にUIスレッドに届きます。ですから、あなたはasynchタスクをonClick()から簡単に開始することができます。または、あなたのケースでは、タスクが既に生きている場合は、onClick()から呼び出すことができます。しかし、Asynchタスクは、ボタンがあることを決して知らないでしょう!

MyTask myTask; 

class MyTask extends AsyncTask{ 

    private boolean shouldDoTheStuff = false; 

    public synchronized void doSomeStuff(){ 
      shouldDoTheStuff = true; 
    } 

    protected synchronized Boolean doInBackground(Void... params) { 
     while(true){ 
      Thread.sleep(200); 
      if(shouldDoTheStuff){ 
        //react to the click 
        shouldDoTheStuff = false; 
      } 
     } 
    } 
} 


private View.OnClickListener btnOkListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     myTask.doSomeStuff(); 
    } 
}; 

同期の代わりに、よりクリーンな方法であるAtomicBoolenを使用できます。

+0

ありがとうございます!しかし、コンストラクタにViewを渡すことができない場合、どのように私はonProgressUpdate()からUIを更新できますか?主なアクティビティからメソッドを起動することはできますか?そうでなければ、AsyncTaskで直接ビューを定義するだけですか? – Starivore

+0

はい、publishProgress()経由でonProgressUpdate()を使用して、アクティビティを呼び出すことができます。 2つのケースがあります.AynchTaskが匿名の実装である場合、onAccessivity()メソッドからMyActivityName.this.updateSomeStaff()を呼び出すことができます。匿名でない場合は、タスククラスのコンストラクタを通過できるインターフェイスを使用できます。何らかの理由で活動が死んでいる場合は、WeakReferenceに保管してください。 WeakReference経由でインタフェースを呼び出すときは、まずnullをチェックし、それを介してコールバックを行います。 :) –

+0

また、タスクのライフを管理する多くのケースがあります。たとえば、状態を保持しているフラグメントでラップするなど、これははるかに複雑です。 :) –

関連する問題