工作线程上的警报对话框

时间:2015-06-20 14:05:27

标签: android alertdialog ui-thread

我有一个“MessageParser”类,它扩展了

  

AbstractParser

和调用的方法“onMessagePacketReceived” 方法:

conversation.add(message);

add是实体“对话”的一种方法,它扩展了

  

AbstractEntity

并添加如下收到的消息:

public void add(Message message) {
    message.setConversation(this);
    synchronized (this.messages) {
        this.messages.add(message);
    }
}

我想要做的是显示一个警告对话框,其输入如下:

 AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(R.string.input_pass);
        View dialogView = getLayoutInflater().inflate(R.layout.set_password_dialog, null);
        builder.setView(dialogView);
        builder.setNegativeButton(R.string.cancel, null);
        builder.setPositiveButton(R.string.next, null);
        final AlertDialog dialog = builder.create();
        dialog.show();

        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(
                new View.OnClickListener() {

                    @Override
                    public void onClick(final View v) {
                        EditText edit = (EditText) dialog.findViewById(R.id.account_password);
                        String pass = edit.getText().toString();
                        if (pass.equals(accountList.get(0).getPassword())) {
                            conversation.add(message);
                            dialog.dismiss();
                        } else {
                            edit.setError(getString(R.string.incorrect_pass));
                        }
                    }
                });

取代了conversation.add(消息)。我遇到了麻烦。它显示

  

无法在未调用的线程内创建处理程序   Looper.prepare()

我见过this回答,但对我没有帮助。

1 个答案:

答案 0 :(得分:0)

问题在于您正在尝试创建并在非UI线程中显示对话框(这就是错误所说的内容,通常只有主UI线程调用Looper.prepare())。要修复它,请使用以下代码:

activity.runOnUiThread(new Runnable() {
    @Override public void run() {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(R.string.input_pass);
        View dialogView = getLayoutInflater().inflate(R.layout.set_password_dialog, null);
        builder.setView(dialogView);
        builder.setNegativeButton(R.string.cancel, null);
        builder.setPositiveButton(R.string.next, null);
        final AlertDialog dialog = builder.create();
        dialog.show();
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(final View v) {
                        EditText edit = (EditText) dialog.findViewById(R.id.account_password);
                        String pass = edit.getText().toString();
                        if (pass.equals(accountList.get(0).getPassword())) {
                            conversation.add(message);
                            dialog.dismiss();
                        } else {
                            edit.setError(getString(R.string.incorrect_pass));
                        }
                    }
                });
    }});

修改
在上面的代码中,activity变量应该由创建时的活动传递。

如果这不起作用,请发布整个日志猫。