0

一部の電話でスレッドと`onclickリスナーインスタンスで奇妙な動作をしています(Androidバージョンではなく、Android 4.03を搭載したGalaxyIIでテストして動作し、3.2を搭載したSamsumgGalaxyTabでは正常に動作しますandroid4.03を搭載したHTCEVODesign4Gおよびandroid2.3.3を搭載したHTCEVO4Gは機能しません)ので、ここに問題があります:

Webサービスを呼び出し、サービスが終了するまで画面をブロックする非同期クラスがあります。その後、スレッドはUIにサービス呼び出しが終了したことを通知し、UIaddView(GenerateView)にアクティビティを作成するモーダル画面が表示されます。複数のビューがアクティビティに追加されているため、アクションをトリガーするボタンの複数のクリックを回避する必要があるまで、これは正常に機能します。だから私はOnClickListenerこのようなカスタムを実装します:

public abstract class OnOneClickListener implements OnClickListener {
    private boolean clickable;

    public OnOneClickListener(){
        clickable = true;
    }

   public final void onClick(View v) {
       if (clickable) {
           clickable = false;
           onOneClick(v);
       }
   }

   public abstract void onOneClick(View v);

   public void reset() {
       clickable = true;
   }
}

そこで、カスタムを実装しonclick、ボタンのクリック可能性をブロックし、Webサービスを呼び出し、ビューを作成して返す関数で終了したら、モーダルウィンドウが呼び出してアクティビティに追加し、reset()ボタンを再度クリックできるようにします。その関数は、パラメーターによってクラスのインスタンスを受け取ります。これは前述の電話の魅力のように機能しますが、HTCでデバッグすると、関数がOnOneClickListener()クリック可能な変数を変更し、関数がそれを認識reset()しないことがわかります。そしてそれは逆の方法でも起こります。たとえば、関数の呼び出しがクラスの2つの異なるインスタンスにある場合とそうでない場合のように!! これは、HTCとスレッドで発生する問題の1つであり、最も驚くべき問題です。

だからここに私の質問があります:

  • HTCとスレッドに関する既知の問題はありますか?
  • 回避策はありますか?(AsyncTaskを使用して呼び出しを行っており、これまでは完璧に機能していました)

実際、失敗がどこにあるのかを理解するのに役立つと言えることは、私を夢中にさせるので非常に役立ちます。

4

2 に答える 2

1

幸運なことに、一部の電話では機能する必要がないため、機能します。一方のスレッドのフィールドを変更する場合clickableは、もう一方のスレッドを明示的に同期して変更を確認する必要があります。

clickableフィールドを作ってみてくださいvolatile。Jeremy Mansonには、Javaの並行性に関する優れた記事がありますvolatile

また、他の方法で必要なものを実装することをお勧めします。Webサービスで結果が得られるまで、最初のクリックでボタンを無効にするだけです。無効化されたボタンは、クリックを処理し、無効化されている間に何かを実行していることを示す明確なメッセージです。

ウィキペディアの「Happened-beforeterm」も確認してください。

于 2012-09-17T21:51:07.317 に答える
0

UI スレッドでクリック機能のすべての有効化/無効化を実行する限り、これは正常に機能するはずです。

とにかく、「 setClickable 」と呼ばれる API 関数が組み込まれています。なぜ使わないのですか?

于 2012-09-17T22:09:02.673 に答える