【问题标题】:Alert Dialog on work thread工作线程上的警报对话框
【发布时间】:2015-09-06 10:09:54
【问题描述】:

我有一个扩展类“MessageParser”

抽象解析器

还有一个方法“onMessagePacketReceived”,它调用 一种方法:

conversation.add(message);

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

抽象实体

并添加收到的消息,如下所示:

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(message)。我在这方面遇到了麻烦。它显示

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

我已经看到this 的回答,但对我没有帮助。

【问题讨论】:

    标签: android android-alertdialog ui-thread


    【解决方案1】:

    问题是您正在尝试在非 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 变量应该在创建时由活动传递。

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

    【讨论】:

    • 错误:(683, 9) 错误: 找不到符号方法runOnUiThread()
    • 你如何使用这个解析器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多