0

ボタンの状態を mysql db から直接変更しようとしています。状態は次のとおり

です。 1. 有効
2. 無効。

私はAsynctaskいくつかのクエリを実行し、true または false のような結果を返す を持っています。

誰かがデータベースの値を手動で変更した場合、ボタンの状態を自動的に変更したいこれを行うための最良の方法または方法は何ですか。

ありがとう

4

1 に答える 1

1

変更を周期的にリッスンするスレッドが最適なソリューションだと思います。それにもかかわらず、AsyncTask の使用はこれを達成するための推奨される方法ではありません。設計上、AsyncTask は短時間実行される操作にのみ使用する必要があるためです。ワーカー スレッドを使用し、UI スレッドへのハンドラーをワーカー スレッドに渡し、このハンドラーを介してボタンを更新します。

public class MyThread extends Thread{

    private final long WAITING_TIME = 5000;
    private Handler handler;
    private boolean current_state = false;

    MyThread(Handler handler){
        this.handler = handler;
    }

    run(){
        new_state = // retrieve from database;
        if(new_state != current_state){
            handler.send(new Message().setData(new Bundle().putBoolean("STATE",new_state)));
            current_state = new_state;
        }
        this.wait(WAITING_TIME);
    }
}

そして、Activity で、到着したメッセージを解析し、必要な変更を行います (これがハンドラーと通信する唯一のスレッドである場合、メッセージを解析する必要はありません。新しいメッセージがそれぞれボタンの状態の変化を意味することがわかっているためです)。 )。したがって、たとえば onCreate() コールバックで:

handler = new Handler(){
    public void handleMessage(Message message){
        if(message.getBundle().getBoolean("STATE"))
            //activate button
        else
            //deactivate button
    }
}

new MyThread(handler).start();

もう 1 つの解決策は、データベースからの通知を待機するリアクティブ エージェントをアプリケーションで使用することです。しかし、これはアプリケーションとバックエンドの両方を劣化したサーバーに変えてしまうため、良い設計ではありません。

于 2013-07-24T18:49:52.673 に答える