2010-12-07 13 views
0

私はAndroidアプリケーションでパフォーマンスを向上させるためにスレッドを使用しようとしました。私は私の見解のいくつかの設定を変更するこれらの方法でAndroidスレッド:スレッドからのビューを参照

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.play); 

    ... 

    new Thread(new Runnable() { 
     public void run() { 
     makeList(); 
     } 
    }).start(); 

    new Thread(new Runnable() { 
     public void run() { 
     setChronometer(); 
     } 
    }).start(); 
} 

onCreate方法で は、私は2つのスレッドを開始しました。 (何の重いイベントはありません)

まずクロノメーター:

ListView
private void setChronometer(){ 
time.post(new Runnable() { 
     public void run() { 
     time.setFormat("Time: %s"); 
     time.setBase(SystemClock.elapsedRealtime()); 
     time.start(); 
     } 
     }); 
} 

第二:ChronometermakeList()での操作が行われていなかった はなく、正常に動作します

private void makeList(){ 
    ... 
     final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(...); 

     list.post(new Runnable() { 
     public void run() { 
      list.setAdapter(listAdapter); 
      list.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    .... 

     } 
     }); 
} 

..ので、私のListViewが動作していません!

私はまず

を活動の開始時に、ListViewコントロールとクロノメーターを定義することはそれほど重要であるので、私は活動がより速く起動すること(もっとperformatである)ことを、目的とし、スレッドでそれらを延期するという考えを持っていましたこれはいいアイデアですか?

第2に、私のリストビューが機能しないのはなぜですか?私が除外するときlist.post(new Runnable() { それは働くが、私はそれがアンドロイドの良い方法ではないと思った。これで、ビューはスレッドから直接変更されます。

第3に、スレッドはいつ使うべきですかvs.View.post

ご協力いただきありがとうございます。あなたのView sおよびListView秒など - - だけで今までに、UIスレッド(つまりメインスレッド)によってアクセスされなければならない。覚えておくべき FireDragon

+0

テキストにバッククォート( ')を使用しないでください。バックスティックはマークダウンで特別な意味を持つため、( ')を使用しないでください。 –

答えて

1

最初の事はあなたのUIの要素があることである

ご挨拶バックグラウンドスレッドからUIを変更する場合は、Handler(UIスレッド)をインスタンス化し、バックグラウンドスレッドからメッセージおよび/またはランナブルを送信する必要があります。

音が少し乱雑ですか?幸いにも、Androidには、AsyncTaskという非常に強力なクラスが含まれています。正確にはあなたは忙しい学習をするために必要なものです。あなたはルーベンはAsyncTaskに関する権利である

+0

貼り付けたコードには、バックグラウンドスレッドに必要なものは表示されません。アダプターの設定などはすべてUI initであり、UIスレッドにとどまるべきです。ただし、ストレージから、またはネットワーク経由でデータを読み込む - あらゆる種類の遅いI/O - *は、バックグラウンドで行う必要があります。 –

+0

Okey、あなたの答えをありがとう! – FireDragon

0
などの

doInBackground()メンバーだし、あなたがonPostExecute()であなたのUIの更新を行い、それがnew Thread()と周りいじるよりもOH-SO-はるかに簡単だとHandlerそれであなたのバックグラウンドスレッドコードを置きます。しかし、スレッディングの仕組みを理解したい場合は、various approaches on blogを詳しく説明しました。 AsyncTaskは行く方法です。

関連する問題