0

BluetoothChatService にダイアログを追加しようとしています。このダイアログは、接続が確立できないか失われた場合に Bluetooth 接続を再試行するように促します。AlertDialog.show() の実行時に実行時例外が発生します。このエラーは Handler.java で発生し、「Looper.prepare() を呼び出していないスレッド内でハンドラを作成できません」というエラーが表示され、mLooper は null です。「new AlertDialog.Builder(Activity.this)」など、stackoverflow で見つかった他のソリューションを試しました。何も機能していません。

編集:スレッド内のダイアログのアプローチが問題のようです。スレッドを作成している UI アクティビティの制約内でダイアログを再コーディングします。回答してくれたすべての人に感謝します。

コード:

public class BluetoothChatService {

private Context context;
private final BluetoothAdapter mAdapter;
private int mState;

public BluetoothChatService(Context context) {
    this.context = context;
    mAdapter = BluetoothAdapter.getDefaultAdapter();
    mState = STATE_NONE;
}

private void connectionFailed(String s) {
    // Send a failure message back to the Activity
    stop();
    sendToastMessage(String.format(context.getApplicationContext().getString(R.string.bluetooth_cannot_connect), s));
    createRetryDialog(R.string.bluetooth_cannot_connect, s);
}

// ---------------------------------------------------------------------------------------------
private void createRetryDialog(int msg_id, String err_msg) {
    AlertDialog.Builder alertDialogBuilderRetry;
    alertDialogBuilderRetry = new AlertDialog.Builder(context);
    String message = String.format(context.getApplicationContext().getString(msg_id), err_msg);

    // set title
    alertDialogBuilderRetry.setTitle(context.getApplicationContext().getString(R.string.bluetooth_title_connect_error));

    // set dialog message
    alertDialogBuilderRetry
        .setMessage(message)
        .setCancelable(false)
        .setPositiveButton(context.getApplicationContext().getString(R.string.dialog_button_yes), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int id) {
                // Start the service over to restart listening mode
                initializeBluetooth();
                dialog.dismiss();
            }
        })
        .setNegativeButton(context.getApplicationContext().getString(R.string.dialog_button_no),new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int id) {
                // if this button is clicked, just close
                // the dialog box and do nothing
                mState = STATE_NONE;
                dialog.cancel();
            }
        }).create().show();
}
}
4

1 に答える 1

0

これを呼び出すときは、アプリケーション コンテキストではなく、アクティビティ コンテキストで渡していることを確認してください。アプリケーションコンテキストを使用してダイアログを表示することはできません。

于 2012-09-04T13:10:39.107 に答える