从另一个类访问活动的UI元素

时间:2014-05-08 22:35:11

标签: android multithreading

好的首先,android真的很混乱。方案是我有两个可从登录视图创建的可运行类,如果登录它将创建另一个视图,该视图将包含其他数据,甚至可以从那里创建更多活动

现在,我可以在为runnable类创建线程时传递Login视图上下文,并在其中编辑出UI元素,如下所示:

((Activity)someContext).runOnUiThread(new Runnable(){
    public void run()
    {
        TextView txtErr = (TextView) ((Activity)someContext).findViewById(R.id.errMsg);
        txtErr.setText("Some message");
    } 
});

但问题是,将会有更多活动被创建,并且在登录时会创建可运行的类,并且我无法继续传递上下文。

是否有更好的方法可以从不同的线程访问不同活动的UI元素?

P.S:将访问UI元素的线程不会扩展Activity并在单独的线程中运行。

修改

我想我需要更清楚地提出我的问题......我正在为信使开发一个客户端应用程序......这个过程就是这样...用户点击登录按钮,在一个名为的单独的类中创建一个线程ClientThread用于处理套接字连接并保持连接处于活动状态,直到用户注销或连接断开。 ClientThread类循环直到套接字连接,每当收到一些数据时,数据就会传递给名为ProcessDataThread的类中的另一个线程,该类会解析数据并相应地更新UI。

现在,在服务器的响应中,如果用户已登录,我想从该类创建一个活动,并在ProcessDataThread中保留该活动的上下文,因为我将更新来自服务器的进一步响应的UI。如果登录失败ProcessDataThread将在主要活动上显示一条消息,说登录失败,现在我可以通过将上下文从MainActivity传递到两个线程来实现后者,当点击登录时就像这样:

global_constants.clientObject = new ClientThread(this);
global_constants.clientThread = new Thread(global_constants.clientObject);
global_constants.clientThread.start();

然后从ClientThreadProcessDataThread

global_constants.updateConversationHandler.post(new ProcessDataThread(SharedBuff, cntxt));

但是我如何从非活动类创建更多活动并全部更新它们或找到UI元素等...

1 个答案:

答案 0 :(得分:1)

不确定我是否理解你,但听起来你正试图从Activity之外控制活动的视图。这听起来很丑陋。我让每个Activity管理自己的用户界面。

在对象之间进行解耦通信的一种好方法是观察者模式,即“事件总线”或“事件调度程序”系统。有关如何在Android上执行此操作的示例,请访问:http://www.therealjoshua.com/2012/03/event-dispatching-sending-messages/

基本上,生成错误的代码应该发送消息。 Activity可以侦听此消息,然后根据需要更新自己的UI。

修改

感谢您的澄清。我认为观察者模式在这里仍然有用。基本上,您的数据处理线程不应该知道有关UI的任何信息。只需让他们发布错误事件,可选择提供有关错误的其他信息。如果需要,您的事件调度程序类甚至可以使用您显示的Runnable在UI线程本身上进行实际事件调用,以便侦听器始终可以假设它们在UI线程上被调用,如果这样对您的设计很重要。这样您就不必将上下文传递给线程(至少不是为了更新UI) - 让工作线程只负责工作,并且活动可以负责自己的UI。


您可以使用的另一个选项是android Handler(请参阅http://developer.android.com/reference/android/os/Handler.html) 在这种情况下,工作仍在另一个线程中完成,但Activity在适当的时间从线程接收handleMessage回调。我自己没有使用它,但是从文档看起来它可以完成你所需要的工作。

在IMO的任何一种情况下,更新UI的责任应该在于Activity,而不是工作线程。