2011-09-03 5 views
16

私は非同期タスクを使用してメニューアクティビティから文字列を取得し、いくつかのものをロードします。しかし、私は できません。私は正しい方法でそれを使用しています。パラメータは正しくありますか? コードスニペットをご覧ください。おかげで、これに代えてパラメータをAsynctaskに渡す

private class Setup extends AsyncTask<Void, Integer, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      if (!(getIntent().getExtras().isEmpty())) { 
       Bundle gotid = getIntent().getExtras(); 
       identifier = gotid.getString("key"); 
      } 
     } catch (Exception e) { 
      e.getStackTrace(); 
     } finally { 

      if (identifier.matches("abc")) { 
       publishProgress(0); 
       db.insert_fri(); 
      } else if ((identifier.matches("xyz"))) { 
       publishProgress(1); 
       db.insert_met(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... i) { 
     // start the song here 
     if (i[0] == 0) { 
      song.setLooping(true); 
      song.start(); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void res) { 

    } 

    @Override 
    protected void onPreExecute() { 
     // do something before execution 
    } 
} 

答えて

15

iは

private class Setup extends AsyncTask<String, Integer, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
    String identifier = params[0]; 

      if (identifier.matches("abc")) { 
       publishProgress(0); 
       db.insert_fri(); 
      } else if ((identifier.matches("xyz"))) { 
       publishProgress(1); 
       db.insert_met(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... i) { 
     // start the song here 
     if (i[0] == 0) { 
      song.setLooping(true); 
      song.start(); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void res) { 

    } 

    @Override 
    protected void onPreExecute() { 
     // do something before execution 
    } 
} 

を行うと、この

if (!(getIntent().getExtras().isEmpty())) { 
       Bundle gotid = getIntent().getExtras(); 
       identifier = gotid.getString("key"); 
       new Setup().execute(identifier); 
    } 
4
ようAsyncTask

を作成するオーバーヘッドを防ぐためにasynctaskを呼び出す前に、 "識別子" をチェックします

簡単な方法は、コンストラクタを追加することです:

public Setup(String a, Int b) { 
    this.a = a; 
    this.b = b; 
} 
0

AsyncTaskはdoInBackground()がVoidを返し、onProgressUpdate()がIntegersを受け取り、doInbackgroundがtake ...という文字列を受け取ります。

インテントは、スレッドではなくアクティビティを介して引数を渡すためのものであるため、使用する必要はありません(本当に使用すべきではありません)。

そして、あなたは「識別子」

public class Setup... 
{ 
    private String identifier; 

    public Setup(String a) { 
    identifier = a; 
    } 
} 

と呼ばれるクラスにコンストラクタとグローバルパラメータは、それは助けることができる望ん作ることができ、前に言ったように。 よろしくお願いします。

23

コンストラクタを追加しないでください。

単に方法

new BackgroundTask().execute(a, b, c); // can have any number of params 

を実行するタスクであなたの偶然にを渡す今、あなたのバックグラウンドクラスは、なぜ「コンストラクタを追加しない」この

public class BackgroundTask extends AsyncTask<String, Integer, Long> { 

    @Override 
    protected Long doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     String a = arg0[0]; 
     String b = arg0[1]; 
     String c = arg0[2]; 
     //Do the heavy task with a,b,c 
     return null; 
    } 
    //you can keep other methods as well postExecute , preExecute, etc 

} 
+4

のようになりますか?私はasynctaskのプライベートフィールドを初期化するためにコンストラクタを使うことがなぜAndroidの悪いことかを判断しようとしています。 – bsautner

+0

私はそれが悪い考えではないと言っていましたが、パラメータを渡すためには、メモリを無駄にしてしまうので、コンストラクタルートを経由しないでください。 – HimalayanCoder

+1

どのくらいのメモリを無駄にすることができますか? –

関連する問題