2

ハンドラー、asynctask、または runOnUiThread で ui 要素を更新する理由について混乱しています。UI スレッドにいる場合は、1 から 4 までの番号が付けられた次のスニペットを検討してください: (デモ目的のため、構文エラーがある可能性があります)

// in MainActivity.java #1
public void onCreate(Bundle bundle) {
     setContentView(R.layout.main);
     TextView name = (TextView)findViewById(R.id.name);
     name.setText("Name Changed!!");
}


// in MainActivity.java #2
public void onCreate(Bundle bundle) {
     setContentView(R.layout.main);
     TextView name = (TextView)findViewById(R.id.name);
     handler.post(new Runnable() {
           public void run() {
               name.setText("Name Changed!!");
           }
          });
}

// in MainActivity.java #3
public void onCreate(Bundle bundle) {
     setContentView(R.layout.main);
     TextView name = (TextView)findViewById(R.id.name);
     runOnUiThread(new Runnable() {
           public void run() {
               name.setText("Name Changed!!");
           }
          });
}

// in MainActivity.java #4
public void onCreate(Bundle bundle) {
     setContentView(R.layout.main);
     ...same thing,...update textview in AsyncTask
}

 // in MainActivity.java #5
public void onCreate(Bundle bundle) {
     setContentView(R.layout.main);
      TextView name = (TextView)findViewById(R.id.name);
     name.post(new Runnable() {
           public void run() {
               name.setText("Name Changed!!");
           }
          });
}

例 #1 ~ #4 からわかるように、#2、#3、または #4 を使用する必要がある理由がわかりません。なぜなら、#1 は既に UI スレッドにいるからです!!!

つまり、#1 から #4 は同じだと言っています。つまり、UI スレッド/メイン スレッドで何かを実行したい場合、#2、#3、または #4 を使用する理由を教えてください。 1 は既に UI スレッドにあります。

それぞれの違いは何ですか?

ドキュメントまたは実際の使用例の引用を提供してください

ありがとうございました!!

4

3 に答える 3

0

1 これは、UI スレッドを使用しているため、UI を更新するための正しく最も直接的な方法です。

  • 単純に UI を更新する場合は、#2 #3 と #4 は必要ありません

2ハンドラーは、別のスレッドでタスクを実行する必要がある場合に特に使用されます

3 runonUI () は、既に UI スレッド上にあるため、oncreate() では使用されません。非同期タスクの doinbackground() など、非 UI スレッドから UI を更新するために使用されます。

4 非同期タスクは、UI 要素だけを更新するために使用しないでください。主な目的は、アクティビティのバックグラウンドでのみタスクを実行することです。ただし、実行前および実行後の関数は UI を更新できます。

于 2013-04-23T05:16:24.430 に答える