2

そこでまず、別のスレッドからUIを更新する方法を見つけました。私は他の何かのためにAsyncTaskとHandlerクラスを使用しています

しかし、そもそも私はそれを間違えました。そして今、私は本当に何が悪かったのかを知りたいのです。

したがって、私の最初の試みはMyListener、methodeupdateUI()を使用してJavaインターフェースを作成し、メインアクティビティにそのリスナーインターフェースを実装させることでした。httpリクエストを処理するスレッドにリスナーとしてメインアクティビティを登録したより。そのスレッドからMyListener.updateUI()、リクエストが行われた後に呼び出しました。updateUI()一部のテキストビューをリクエストの結果で更新します。

これはAndroidでは機能しません。そして、私はそれを期待していませんでした。そして、その理由はわかりません。例外は、UIスレッドからこれらの更新を行う必要があることを教えてくれました。

リスナーインターフェイスから実装されているメインアクティビティでupdateUI()呼び出したときに、UIスレッドで実行されない理由がわかりません。MyListener.updateUI()updateUI()

この振る舞いについて説明してもらえますか?

4

3 に答える 3

3

他のスレッドでhttpリクエストを実行したようですが、使用していませんAsyncTaskよね?doInBackgroundそのクラスを使用し、メソッドでhttpリクエストを実行し(メインスレッドで機能するため)、このメソッドは常にメインスレッドで呼び出されるためMyListener.updateUI()、呼び出すことをお勧めします。onPostExcute試してみて、うまくいくかどうか教えてください。

于 2013-02-28T17:11:40.203 に答える
2

ビューを更新できるのはアプリケーションのメインスレッドでのみであるため、のメソッドを呼び出しているか、別のスレッドから呼び出しているかは関係ありませんMyListener.updateUI()。例外がスローされます。これを達成するために、あなたはそのようなことをすることができます:MainActivityonCreate()

public static void updateUI(){

       ((Activity) mContext).runOnUiThread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            // update your UI here and be sure to give the activity context, not getApplicationContext();
        }
    });

}

これをあなたのアクティビティに入れて、あなたのonCreate()そのようなことをしてください:

public static Context mContext;
@Override
public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);
   mContext = this;
}

updateUI()やりたいスレッドから呼び出します。

もちろん、インターフェースを更新できるのはこれだけではありませんAsyncTask。AndroidSDKでの実装を確認できます。それは本当に強力なクラスであり、あなたが望むことをより効率的に行うことができると思います。

于 2013-02-28T16:11:39.510 に答える
1

コントロールがまだバックグラウンドスレッド内にあるため、このエラーが発生していました...アクティビティに実装されているインターフェイスメソッドを呼び出しましたが、コントロールをUIスレッドに戻すには、を使用して投稿する必要があります。ハンドラー。アクティビティにあるメソッドを呼び出すだけでは、コントロールはバックグラウンドスレッドからUIスレッドに移動しません。

これがあなたの疑問を明らかにすることを願っています。

于 2013-02-28T16:07:28.273 に答える