0

さまざまなアクティビティを持つ Android アプリケーションがあり、それらはすべて Web ソースからデータを取得します。これは、Runnable を実装し、アクティビティをオブジェクトとして持つスレッドを作成することによって行われます。基本クラスは次のようになります。

public ActivityX extends Activity implements Runnable {

    @Override
    public onResume() {
        super.onResume();
        Thread someThread = new Thread(this);
        someThread.start();
    }

    @Override
    public run() {
        try {
            // pull web content
        }
        catch(TimeOutException e) {
            // >>> create dialog here <<<
            // go back to another activity
        }
    }
}

タイムアウト ダイアログを返し、次のように show() を呼び出す静的メソッドを使用してダイアログ ヘルパー クラスを作成しようとしました。

HelperClass.getTimeOutDialog().show();

しかし問題は、別のスレッドにあるため、run() メソッド内から呼び出すことができないことです。実行しようとすると、次のような実行時例外が発生します。

Looper.prepare() を呼び出していないスレッド内でハンドラーを作成できません

私はほぼ十数のアクティビティに対してこのダイアログを実行する必要があり、実際には Handler オブジェクトを使用してメッセージを送信し、毎回ダイアログを呼び出すようにしたいと考えています。これを行う簡単な方法はありませんか?残念ながら今のところ思いつきません。

私のコードは次のようになります。

handler.handleEmptyMessage(1);

これは、ハンドラーを呼び出すことです。そして、以下はメッセージを処理します:

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if(msg.what == 1) {
            // show dialog here
        }
    }
};

乾杯

4

2 に答える 2

1
@Override
    public run() {
        try {
            // pull web content
        }
        catch(TimeOutException e) {
             runOnUiThread(new Runnable(){
                 @Override
                 public void run() {
                    // >>> create dialog here <<<
                    // go back to another activity
                 }  
             }

        }
    }

Handler を使用したくない場合は、上記のものを試してください。

于 2012-05-01T03:24:27.477 に答える
0
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if(msg.what == 1) {
            // show dialog here
        }
    }
};

このコードはスレッドではなくアクティビティの一部ですか? 非 Ui スレッドの一部である場合、エラー メッセージが表示されます。ハンドラーには、ハンドラーが作成されるスレッドへの暗黙的な参照が含まれているため、UI スレッドでハンドラー インスタンスが作成されていることを確認してください。

于 2012-04-30T18:10:05.513 に答える