9

タイマーを設定するコードがいくつかありますが、ユーザーが使用中にタイマーを設定した場合、タイマーを実行するランナブルを削除して再度開始する必要があります。しかし、実行可能なハンドラー コールバックが存在せず、このコードが呼び出されると、アプリケーションがクラッシュします。そのため、ハンドラーが実行されているかどうかを確認する必要があります。実行されている場合は終了して再起動しますが、ドキュメントやその他の Stackoverflow の質問を調べても、これが可能かどうかはわかりません。

これが私のコードです。実行可能なハンドラーが存在する場合にのみ実行する必要があるコードについてコメントしました。

    submitTimer.setOnClickListener(new View.OnClickListener(){

        public void onClick(View v) {
            String s = timer.getText().toString();
            if(!s.equals(""))
            {
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE
            Map.handler.removeCallbacks(Map.getRunnable());
            Map.runnable.run();
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE
            int l = Integer.parseInt(s);
            Map.timerinmins = l;
            timer.setHint("Current Timer is "+Map.timerinmins);
            timer.setText("");
            Toast.makeText(Preferences.this, "Timer is set!", Toast.LENGTH_SHORT).show();
            }

            else
            {

                Toast.makeText(Preferences.this, "No value was entered", Toast.LENGTH_SHORT).show();
            }
    }

});

ハンドラーの現在の状態を確認する方法を理解するのを手伝ってくれる人はいますか?

4

3 に答える 3

4

必要に応じて、最初にコールバックを入れたときに空のメッセージを送信し、ハンドラーでそのメッセージを確認できます。この空のメッセージは、コールバックが存在することを示している可能性があります。後でそのメッセージを削除すると、コールバックがまだ存在するかどうかを確認するために同様に使用できます。このような関連する状況はありませんが、少なくとも可能性を共有しようと思いました.

...
Map.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER);
...
if(Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER)
...
Map.handler.removeMessage(CALLBACK_PRESENT_INTEGER);
...

これはおそらく理想的ではありませんが、コールバックが使用されるポイントからハンドラーにアクセスできる場合は、潜在的な解決策になる可能性があります。直接調べる方法があるかどうかはわかりません。

于 2013-04-04T16:36:13.860 に答える
4

Jay Snayderの返信を参照してください。

Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER)呼び出されても falseを返す場合があるのでMap.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER)(私もそうでした)、ブール値を使用してハンドラーがコールバックを持っているかどうかを判断する方が安全かもしれません。
したがって、コード ロジックは次のように非常に単純です。

...

boolean callbackPresent = false;

...

if(!callbackPresent) {

    // do what you have to do in case the handler doesn't have callbacks

    // right before adding a callback to the handler, call:
    callbackPresent = true;

} else {

    // do what you have to do in case the handler has callbacks

    // right before removing the callbacks from the handler, call:
    callbackPresent = false;
}

...

このソリューションをアプリで使用していますが、完全に機能しています。

于 2014-11-01T23:50:01.180 に答える