我已经构建了一个Android应用程序,它从六个不同的活动中调用TCP套接字相关的线程。它工作得很好,但是当我尝试添加一个简单的对话框时,在启动线程之前询问用户的id / pw(线程中将需要检索到的数据),我遇到了麻烦。有一个适配器类实际上被调用来启动线程,但它也不是一个" Activity"这可以实现一个对话框。
有什么方法可以用更智能的方法解决这个问题吗?添加六个相同的代码来创建对话框,并为每个对话框实现额外的六个相同的处理程序将解决这个问题,但我不认为这不是正确的做法。
我尝试将对话框设置为一个Activity(带有对话框主题),但它无法返回任何数据,因为启动此对话框的类(如activity)不是Activity(因此,startActivityForResult无效)。
我该如何解决这个问题?改革整个来源是不可能的,因为它已超过20,000线。请帮忙!
答案 0 :(得分:1)
不是UI /主线程的线程无法像对话框那样控制UI元素。但是有一种方法可以让你的代码的一部分在主线程上运行,然后就可以做到这一点。
您希望将内容发布到主处理程序,如下所示:
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
}
});
答案 1 :(得分:0)
好吧,我终于找到了这个简单的问题。
要在非UI线程上调用Dialog.show(),我需要使用Looper.getMainLooper()创建的Handler对象。然后,就像@peedee解释的那样,在run()块上实现要做的事情(UI相关工作)。
接收对话框检索的数据也不困难。在我的Dialog类上添加一些getter方法,并在显示对话框之前添加OnDismissListener就是我所需要的。 (当调用对话框的dismiss()函数时,OnDismissListener会做出反应。)
这是我写的代码。希望它可以提供帮助。
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);