0

Android で何かをプログラミングしていて、遅延を作成したいと考えています。アクティビティ クラス スレッドに追加すると、アプリはデータを変数に実装した後にスタックしますが、(postDelay を使用して) ハンドラーを使用すると正常に動作します。1.なぜ?

コード (mapView と userPointOverlay はクラスのプライベート ローカル変数です):

スレッドの使用:

                new Thread(new Runnable()       //2.5sec delay between switches
                {

                    @Override
                    public void run()
                    {
                        try
                        {
                            Thread.sleep(5000);             
                            mapView.getOverlays().remove(userPointOverlay); 
                        } catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        }                           
                    }
                }).start();

ハンドラーの使用:

                handler.postDelayed(new Runnable()
                {

                    @Override
                    public void run()
                    {
                        mapView.getOverlays().remove(userPointOverlay);                     
                    }
                }, 5000);   

2.スレッドとハンドラーの主な違いは何ですか? 私は、ハンドラーがスレッド上で実行されていることを理解しました(メインスレッドのCPU時間と共有します)、それは正しいですか?

  1. ハンドラーからクラスのローカル変数にアクセスできるようです。しかし、スレッドでは、Eclipseはローカルクラス変数をスレッドに書き込むことができましたが、開始時にこのローカルのアドレスはスレッドローカルとは異なり、スレッドの実行時にこのクラスローカルにアクセスできません。

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

4

3 に答える 3

1

最初の質問がわかりません。言い換えてください

Handleraとaの差Threadは大きい。Android SDK では、実行中のスレッドからのみ UI / アクティビティ スレッドを変更できます。

TextViewつまり、別のスレッドを変更したり、別のスレッドから変更したりすることはできませんButton

Android には、Handlerあるスレッドから別のスレッドにメッセージを送信できるクラスが用意されています。

あなたがしなければならないことは、あなたのメインアクティビティに public static Handler メンバーを配置handleMessageし、クラスのどこかにメソッドを実装することです。

別のスレッド内にいるときは、ハンドラーを呼び出します。

Handlerや など、クラスが提供するいくつかのメソッドがありsendEmptyMessage(int)ますsendMessage(Message)。アプリケーションに最適なものを使用してください。

また、提供した例では、Handler.post()メソッドを使用しています。この場合、メイン スレッドで new を作成するだけで、メソッドRunnableは呼び出されません。handleMessage

于 2012-09-30T16:02:51.710 に答える
1

最初のオプションでは、UI スレッド以外の別のスレッドから mapView や UI コンポーネントなどのビューにアクセスすることは禁止されています。これが、スレッド バージョンが失敗する理由です。

遅延については、ハンドラーを使用する 2 番目のオプションがより良い方法であり、ハンドラーが UI スレッドで宣言されているため失敗しません。これは、ハンドラーに関する重要なポイントをもたらします。ハンドラーは、作成されたスレッドで動作します。ただし、そのスレッドは、UI スレッドなどのルーパー スレッドとして初期化する必要があります。

明確にするために例外を投稿していただければ幸いです。

于 2012-09-30T15:20:55.580 に答える
0

クラスのプライベート フィールドは、それらを宣言するクラスとそのクラスの内部クラスでのみアクセスできます。ハンドラーはクラスのフィールドであり、ハンドラー コード自体は内部クラスです。ランナブルは新しいスレッドで作成されるため、宣言クラスのプライベート フィールドにアクセスできません。次のようなことができます。

class MyClass {

   private MapView mapView;
   private Boolean usePointerOverlay;

   private static Thread thread;

   void method(){

      thread = new Thread(new Runnable.....

   }
}
于 2012-09-30T15:26:16.563 に答える