Android 从非 Activity 类 调用的对话框中创建和返回值

Android creating and returning value from dialogs called from non-Activity classes

我构建了一个 Android 应用程序,它从六个不同的活动中调用与 TCP 套接字相关的线程。它工作得很好,但是当我尝试添加一个简单的对话框时 在启动线程之前询问用户的 id/pw (线程中需要检索到的数据),我遇到了麻烦.有一个适配器class,它实际上被调用来启动线程,但它也不是一个可以实现对话的"Activity"。

有什么更聪明的方法可以解决这个问题吗?添加六个相同的代码来创建对话框,并为每个对话框实现额外的六个相同的处理程序将解决这个问题,但我认为这不是正确的做法。

我试图将对话框设为 Activity(带有对话框主题),但它不能 return 自 class 启动此对话框以来的任何数据 activity 不是 Activity(因此,startActivityForResult 无效)。

我该如何解决这个问题?改造整个源是不可能的,因为它超过了 20,000 行。请帮忙!

非UI/main线程的线程无法像对话框一样控制UI元素。但是有一种方法可以在主线程上制作一部分代码运行,然后你就可以做这些事情了。

您想 post 像这样向主处理程序发送一些内容:

new Handler().post(new Runnable{
    public void run(){
        //Be sure to pass your Activity class, not the Thread
        AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
        //... setup dialog and show
    }
});

好吧,我终于想通了这个简单的问题。

要在非 UI 线程上调用 Dialog.show(),我需要使用 Looper.getMainLooper() 创建的处理程序对象。然后,正如@peedee 解释的那样,在 运行() 块上实现要做的事情(UI 相关工作)。

接收对话框检索到的数据也不难。在我的对话框 class 上添加一些 getter 方法,并在显示对话框之前添加一个 OnDismissListener 是我所需要的。 (OnDismissListener 将在调用对话框的 dismiss() 函数时做出反应。)

这是我写的代码。希望它能提供帮助。

    Handler mHandler = new Handler(Looper.getMainLooper());
    mHandler.postDelayed(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            Log.e("TESTRUNNABLE", "RUNNABLE LOADED");
            cDialog = new TestDialog(mContext);
            cDialog.setTitle("GROUP USER LOGIN");
            cDialog.setOnDismissListener(new OnDismissListener(){
                @Override
                public void onDismiss(DialogInterface dialog) {
                    // TODO Auto-generated method stub
                    nameStr = cDialog.getNameStr();
                    pwStr = cDialog.getPwStr();
                    Toast.makeText(mContext, nameStr + ", " + pwStr, 3000).show();
                    Log.e("DISMISSLISTENER", nameStr + ", " + pwStr);
                }
            });
            cDialog.show();
        }

    }, 0);