好的首先,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();
然后从ClientThread
到ProcessDataThread
global_constants.updateConversationHandler.post(new ProcessDataThread(SharedBuff, cntxt));
但是我如何从非活动类创建更多活动并全部更新它们或找到UI元素等...
答案 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
,而不是工作线程。