2015-02-09 84 views
0

我已经构建了一个Android应用程序,它从六个不同的活动中调用TCP套接字相关的线程。它工作的很好,但是当我尝试添加一个简单的对话框时,会在启动线程之前询问用户的id/pw(在线程中需要检索的数据),所以我遇到了麻烦。有一个实际调用来启动线程的适配器类,但它也不是可以实现对话框的“活动”。Android创建并返回来自非活动类调用的对话框的值

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

我试图让对话框成为一个Activity(带有一个对话框主题),但它不能返回任何数据,因为启动这个对话框的类不像Activity那样是一个Activity(因此startActivityForResult无效)。

我该如何解决这个问题?改革整个来源是不可能的,因为它已经超过2万行。请帮忙!

回答

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 
    } 
}); 
+0

不可思议!将这个代码块添加到我的适配器类中是否解决了整个问题?我的意思是,我需要更多东西吗? – March3April4 2015-02-09 11:26:15

+0

那么你仍然需要弄清楚如何将信息返回到原始线程。我想你需要一些UI线程可以调用的公用方法来存储用户的值。 – peedee 2015-02-09 11:31:48

0

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

要在非UI线程上调用Dialog.show(),我需要一个使用Looper.getMainLooper()创建的Handler对象。然后,就像@peedee解释的那样,在run()块中实现要做的事情(与UI相关的工作)。

接收通过对话检索到的数据也不困难。在我的Dialog类中添加一些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);