2013-03-14 16 views
8

スレッドを実行している主なアクティビティ(MainActivity.java)の内部でAsyncTaskが使用されたのかどうか疑問に思っていました。例えばActivityを拡張するMainActivityの内部でAsyncTaskクラスを使用する必要がありますか?

彼らはメインクラス内のプライベートクラスはActivityを拡張するのではなく、そのAsyncTaskMyAsyncTask.javaclassのための独立した.javaファイルを作成する宣言AsyncTaskを使用したとき、私は多くのチュートリアルに気づきました。

しかし、私は私がrunOnUIThread()を実行することができないよ独立したファイルを使用しているとき、それはActivityクラスに属しているので、どのように私は独立したAsyncTask(MyAsyncTaskの内側に、この方法を使用することができるようになりますので、ことに気づきました。 java)で、AsyncTaskで、Activityではありません。

+0

なぜAsyncTaskからrunOnUIThreadを呼び出すのですか?テキストビューを変更するには – EvilDuck

+0

、他のスレッドからは変更できません。 – Alex

+0

onPostExecuteとonPreExecuteでUIを更新できます –

答えて

12

これは完全に問題ありません。私はそれを頻繁にしますが、あなたの使い方によって異なります。それがActivitiesによって使用されている場合は、私はそれ自身のクラスまたは共有クラスであることを示します。しかし、それが単なる目的のためであれば、私はそれをMainActivityの内部クラスにします。

内部クラスにする利点は、そのクラスのメンバー変数に直接アクセスできることです。別のクラスにする場合は、contextやその他の変数など、paramsを渡す必要がある場合は、そのコンストラクタを作成する必要があります。

私は何をしているのか正確にはわかりませんが、あなたには必ずrunOnUiThread()が必要かどうかわかりません。 AsyncTaskファイルにコンストラクタを作成し、それがparamとして何か必要なものを受け入れるようにcontextを受け入れることができます。そして、あなたはその後、UI

onPostExecute()で例

Public class MyAsyncTask extends AsyncTask 
{ 

private Context context; 

public MyAsyncTask(Context context) { // can take other params if needed 
    this.context = context; 
} 

// Add your AsyncTask methods and logic 
//you can use your context variable in onPostExecute() to manipulate activity UI 
}` 

を更新し、私は彼らが読ん/理解するのが最も簡単であるものは何でも選ぶ最もチュートリアルを信じて、あなたのMainActivity

MyAsyncTask myTask = new MyAsyncTask(this); //can pass other variables as needed 
myTask.execute(); 
+0

私はそれが好きですあなたの答えをありがとう、問題はrunOnUIThread()は、独立したファイルの場合は実行することはできません、私はそれを使用するつもりだから私はしたくない内部クラスを使用する必要があります私は、すべてのアクティビティにAsyncTaskのコード全体を入れるつもりはありません。 – Alex

+0

あなたは内部クラスを使う必要はありません。コンストラクタ内のパラメータとしてアクティビティへの参照を渡します(codeMagicの記述のように)。次に、アクティビティへの参照を使用してrunOnUIThread()メソッドを呼び出します。 – Sababado

+1

onPostExecute()を使用していただきありがとうございます! – Alex

2

でそれを呼び出すことができ、実際には最高のものではありません。

内部クラスを使用すると、アクティビティの変数を利用可能にすることができます。これは簡単に行うことができます。

一般に、可能な限りAsyncTasksをカプセル化して、コード内の他のポイントから再利用することができます。

+0

はいこれは私がそれのための独立したファイルを作りたいので私は1つの目的だけでなく、複数の目的のためにそれを使用することができるようにしたいです – Alex

2

はいMainActivity.javaAsyncTask classを作成できます。

public class CategoryListScreen extends Activity { 


    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
    new loadcategory().execute(); 
} 
class loadcategory extends AsyncTask<Void, Void, Void> { 

@Override 
     protected Void doInBackground(Void... params) { } 

protected void onPostExecute(Void param) { } 
    } // AsyncTask over 
}//main class over 
+0

ことは私がそれを内部クラス。私は別のクラスとしてそれを使いたい。 – Alex

4

一般我々は、それが唯一の同じ活動で使用されていること、それをより明確にするために、同じクラスにAsyncTaskを配置します。

あなたはAsyncTask戸部がより以上の活動により再利用することを望むならば、あなたは、単に独立したクラスを作成し、あなたがにasynctaskから応答を送信するために、あなたasyncTaskにインターフェイスを作成することができますコンストラクタ

での活動からパラメータを渡すことができますあなたの活動は以下のようになり、必要な時はいつでもリスターメソッドを呼び出します。

public class myActivity extends Activity{ 
      private DeckDownloader.OnDownloadUpdateListener downloadListener; 
      TextView txtAsyncResponse; 

      @Override 
      public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       txtAsyncResponse = (TextView) findViewById(R.id.txtAsyncResponse); 


      downloadListener = new DeckDownloader.OnDownloadUpdateListener() { 
       @Override 
       public void OnDownloadDeckFinish(String Response) { 
        txtAsyncResponse.setText(Response); 
       } 
      }; 
    } 

そして、あなたは、コードの下に書くことができます。

public class DeckDownloader extends AsyncTask<Void, Void, String> { 

    OnDownloadUpdateListener listener; 

    public interface OnDownloadUpdateListener { 
     public void OnDownloadDeckFinish(String Response);  
    } 


    public DeckDownloader(Context ctx, OnDownloadUpdateListener listener) { 
     mContext = ctx; 
     this.listener = listener; 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     String str = "downloading"; 
     //your async code goes here 
     return str; 
    } 

    @Override 
    protected void onPreExecute() { 
      super.onPreExecute(); 
    } 

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

とあなたのActivityクラスでは、あなたがそのリスナーを実装し、その実装方法でのTextViewを更新するようにコードを記述する必要があります。私はonPostExecute()それを求めていますあなたのアクティビティでAsyncTaskを開始するには、ボタンクリックイベントなどが必要です。

DeckDownloader mTask = new DeckDownloader(this.getApplicationContext(), downloadListener); 
mTask.execute(); 

これはあなたが必要とするものです。

+0

と私はどのようにビューを変更することができますか?独立したクラスの場合、私はrunOnUIThread()を実行できません。 – Alex

+0

なぜあなたはrunOnUIThreadを使用していますか?あなたはそれのために何が必要ですか? –

+1

私はあなたのコメントを読むのは、テキストビューの内容を変更する必要があることです.TahtはAsyncTaskの完了後に呼び出し側のアクティビティですか?私の理解は正しいのですか? –

関連する問題