Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从另一个类访问活动的UI元素_Android_Multithreading - Fatal编程技术网

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

Android 从另一个类访问活动的UI元素,android,multithreading,Android,Multithreading,好的,首先android真的很让人困惑。场景是我有两个可运行的类,它们是从一个登录视图创建的,如果登录,它将创建另一个视图,该视图将包含其他数据,甚至可以从那里创建更多的活动 现在,我可以在为runnable类创建线程时传递登录视图上下文,并编辑其中的UI元素,如下所示: ((Activity)someContext).runOnUiThread(new Runnable(){ public void run() { TextView txtErr = (Text

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

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

((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描述的事件驱动方式响应模型中的更改(应用程序的状态,例如,它已连接的事实)。模型永远不应该知道关于视图的任何信息,也不应该直接操纵它。感谢您的澄清。我已经更新了我的答案。我也同意凯文在这里的评论。