0

Main アクティビティを、実行中のスレッドを持つ Java クラスに渡そうとしています。スレッドが呼び出されたら、何らかの作業を行って UI を更新するアクティビティ クラス内のいくつかのオブジェクトを参照する必要があります。私のコードは次のようになります。

/**
 *
 */
public class MainActivity extends Activity {

     Person person;

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

          person = new Person();
     }


     public void updateInfo(String action) {

          person.setAction(action);

          //redraw the person to the gui
          ImageView image = (ImageView) findViewById(R.id.action);
          int id = getResources().getIdentifier(person.getCurrentAction(),"drawable", getPackageName());
          image.setImageResource(id);


     }
 }

 /**
  *
  */
 public class ThreadClass {

     private MainActivity mainActivity;

     public SocketClient(MainActivity mainActivity) {
           this.mainActivity = mainActivity;
           new MyThread().start();
     }

     private class MyThread extends Thread {

          public void run() {
              try {
                  while(!isInterrupted() {
                      mainActivity.updateInfo("Person is running");
                  }
              }
          }

     }


 }

このようにすると、正しいスレッドでビューを更新していないというエラーが表示されます。android.View.ViewRoot$CalledFromWrongThreadException. ここで何が間違っていますか?また、他のすべてのロジックを削除する必要があったため、このコードは疑似コードをコンパイルしない可能性が高くなります。

4

1 に答える 1

1

問題が理解できたら、別の角度から作業することをお勧めします。

アクティビティ クラスに合格しないでください。アクティビティ クラスはコントローラーであり、何が起こるかのマスターです。

したがって、オブジェクトとデータをバックグラウンド スレッドに渡します。メイン UI が呼び出されると、UI はスレッドからこれらのオブジェクトを要求し、UI を更新します。

これを定期的に実行したい場合は、スレッドにリスナーを実装することを検討する必要があります。これにより、メイン スレッドはデータの更新時に通知を受け取ることができます。

最後の方法は、古き良き観察者パターンを使用することですが、私はそれを使用することに熱心ではありません。

編集: AsyncTask を見てください: AsyncTask Android の例

于 2012-07-23T13:46:47.100 に答える