1

Android 4.0.3 を対象とする私のアプリでは、スイッチとして機能するボタンを使用していました。ボタンをクリックするとリソースが変更され (再生/一時停止の切り替え)、一部のタスクがバックグラウンドで実行されていました。特徴は、ボタンが押されたときに、トグルを短時間使用できないようにしたかったことです (素早い切り替えを防ぐため)。

そのために、次のように X 秒間待機するスレッドを作成しました。

void blockButton(){
    new Thread() {
        public void run(){
            try {
                        synchronized(this){
                             button_ready = false;
                             sleep(5000);
                             button_ready = true;
                        }
                }
                catch(InterruptedException ex){}
            }
        }.start();
    }
}

そして基本的に私のActivity/onClickListenerで

if(button_ready){
    // Start background stuff
    changeButtonResource();
    button.setEnabled(false);
    blockButton();
    button.setEnabled(true);
}

これまでのところ、すべてが順調に進んでいました。しかし、最終的にはSwitchにアップデートしたいと思いました。コードはほとんど同じです (onClickListener が OnCheckedChangeListener に変わることを除いて)。

しかし、ボタンを1回クリックすると、もう一度クリックするとリソースを変更できますが、バックグラウンドタスクは開始されません(すでにバイブレーターなどで試しましたが、リソースのみが変更されます)。

そのため、ボタンの動作はほとんど同じですが、リソースが台無しになります。どんなアイデアでも大歓迎です!ありがとう。

4

1 に答える 1

1

別のスレッドを作成する必要はありません。View.postDelayed(Runnable)タイムアウト後にボタンを有効にする (または他の UI アクションを実行する) ためのはるかに簡単な方法を提供します。コードは次のようになります。

class ... extends Fragment {
    private final Runnable enabler = new Runnable() { public void run() {
        button.setEnabled(true);
    }};

    private View button;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) {
        View result = ...
        button = result.findViewById(...);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                button.setEnabled(false);
                ...
            }
        });
        ...
    }

    public void onDestroyView() {
        ...
        button = null;
    }

    public void onPause() {
        ...
        button.removeCallbacks(enabler);
    }

    public void onResume() {
        ...
        button.setEnabled(true);
    }
}

orがなくなるremoveCallbacks前に呼び出すことは、無効化された期間中にユーザーが離れることによって発生する同時実行の問題を回避するために重要です。その場合にコールバックを無効にした後、ユーザーがorに戻って保存された状態を復元するときに、無効な状態で「立ち往生」しないようにすることが重要です。FragmentActivityFragmentActivityView

于 2012-12-06T16:09:41.330 に答える