Android 从另一个类访问活动的UI元素
好的,首先android真的很让人困惑。场景是我有两个可运行的类,它们是从一个登录视图创建的,如果登录,它将创建另一个视图,该视图将包含其他数据,甚至可以从那里创建更多的活动 现在,我可以在为runnable类创建线程时传递登录视图上下文,并编辑其中的UI元素,如下所示:Android 从另一个类访问活动的UI元素,android,multithreading,Android,Multithreading,好的,首先android真的很让人困惑。场景是我有两个可运行的类,它们是从一个登录视图创建的,如果登录,它将创建另一个视图,该视图将包含其他数据,甚至可以从那里创建更多的活动 现在,我可以在为runnable类创建线程时传递登录视图上下文,并编辑其中的UI元素,如下所示: ((Activity)someContext).runOnUiThread(new Runnable(){ public void run() { TextView txtErr = (Text
((Activity)someContext).runOnUiThread(new Runnable(){
public void run()
{
TextView txtErr = (TextView) ((Activity)someContext).findViewById(R.id.errMsg);
txtErr.setText("Some message");
}
});
global_constants.clientObject = new ClientThread(this);
global_constants.clientThread = new Thread(global_constants.clientObject);
global_constants.clientThread.start();
但问题是将创建更多的活动,并且在登录时创建runnable类,我不能一直传递上下文
有没有更好的方法从不同的线程访问不同活动的UI元素
注意:访问UI元素的线程不扩展活动,而是在单独的线程中运行
编辑
我想我需要把我的问题弄清楚。。。我正在为messenger开发一个客户端应用程序。。。过程是这样的。。。用户单击登录按钮,该按钮在名为ClientThread
的单独类中创建一个线程,用于处理套接字连接并保持连接活动,直到用户注销或连接断开。ClientThread
类循环,直到连接套接字,并且每当收到一些数据时,数据就会传递到名为ProcessDataThread
的类中的另一个线程,该类对数据进行解析,并相应地更新UI
现在,在服务器的响应中,如果用户已登录,我希望从该类创建一个活动,并在ProcessDataThread
中保留该活动的上下文,因为我将更新来自服务器的进一步响应的UI。如果登录失败,ProcessDataThread
将在主活动上显示一条消息,说明登录失败,现在我可以通过如下方式将上下文从MainActivity
传递到两个线程来实现后者:
((Activity)someContext).runOnUiThread(new Runnable(){
public void run()
{
TextView txtErr = (TextView) ((Activity)someContext).findViewById(R.id.errMsg);
txtErr.setText("Some message");
}
});
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元素等…我不确定是否理解您的意思,但听起来您似乎试图从
活动的外部控制活动的视图。我听上去很讨厌。我会让每个活动
管理自己的UI
在对象之间进行解耦通信的一个好方法是观察者模式,即“事件总线”或“事件调度器”系统。下面是如何在Android上执行此操作的示例:
基本上,生成错误的代码应该发送一条消息。活动可以侦听此消息,然后根据需要更新自己的UI
编辑
谢谢你的澄清。我认为观察者模式在这里仍然有帮助。基本上,您的数据处理线程不应该了解任何有关UI的信息。只要让他们发布一个错误事件,可以选择附加错误信息。如果您愿意,您的事件调度程序类甚至可以像您所展示的那样使用可运行的在UI线程本身上进行实际的事件调用,以便侦听器可以始终假定它们是在UI线程上被调用的,如果这对您的设计很重要的话。这样,您根本不必将上下文传递给线程(至少不是为了更新UI)——让工作线程只负责工作,而活动可以负责自己的UI
您可以使用的另一个选项是android处理程序
(请参阅)
在这种情况下,工作仍然在另一个线程中完成,但是活动
在适当的时间从该线程接收handleMessage
回调。我自己没有用过这个,但从文档来看,它似乎可以满足您的需要
在这两种情况下,IMO更新UI的责任应该由活动而不是工作线程来承担。我更新了帖子来解释这个场景,我希望你现在能理解,我正在查看事件调度,看看这是否能帮助我做我想添加的事情,另一个重要的设计模式是MVC(模型-视图-控制器)及其变体。简言之,活动是一个视图(通常不可避免地混合了一些控制器),应该以@Eliot描述的事件驱动方式响应模型中的更改(应用程序的状态,例如,它已连接的事实)。模型永远不应该知道关于视图的任何信息,也不应该直接操纵它。感谢您的澄清。我已经更新了我的答案。我也同意凯文在这里的评论。