Android多个Activity共用1个线程,如何实时更新Activity界面

bhfqbpb 2017-06-18 11:39:48
目标:在MainActivity中,用(TextView)info_server实时显示服务器反馈的信息。目前的状态是只有点击(Button)send按钮才会更新。如何更改代码(主要是MainActivity.java中)。
【服务端是用JAVA写的服务端,连接数据库,目的是通过手机改写数据库信息,ardunio远程访问服务端读取数据指定信息,进而实时更新自身状态,并反馈给手机控制情况,进而实现手机远程控制ardunio。】
有两个界面
第1个界面,用来实时控制,并接受服务端发送来的信息;第2个界面,用来设置连接,设置IP,端口等。
第2个届满,用来设置网络连接,(IP,端口等)
相关源代码见网址:https://code.csdn.net/snippets/2451102#nogo
手机界面





服务端笔记本(服务端+3个客户端)
...全文
1085 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jing丶無雙 2017-06-28
  • 打赏
  • 举报
回复
已经发给你邮箱了哈
Jay白色风车 2017-06-28
  • 打赏
  • 举报
回复
bhfqbpb 2017-06-28
  • 打赏
  • 举报
回复
引用 23 楼 xj396282771 的回复:
已经发给你邮箱了哈
不胜感激!!!已收到!
bhfqbpb 2017-06-27
  • 打赏
  • 举报
回复
引用 21 楼 xj396282771 的回复:
很抱歉,现在才有时间看你的问题。麻烦留个邮箱,我把我改好的发你
谢谢你!我的邮箱地址是: tanjigong@163.com
Jing丶無雙 2017-06-27
  • 打赏
  • 举报
回复
很抱歉,现在才有时间看你的问题。麻烦留个邮箱,我把我改好的发你
bhfqbpb 2017-06-25
  • 打赏
  • 举报
回复
引用 18 楼 Simple_Simple_Simple 的回复:
简单看了下代码,你java好像也是刚学啊,Activity能拿到ClientThread的实例吧,你好像是这样拿的myAppSocket.getThread() 简单的ClientThread更新MainActivity的思路 1.ClientThread里面定义一个Handler private Handler mainActivityHandler; 2.ClientThread加一个方法 public void setMainActivityHandler(Handler handler){ mainActivityHandler = handler; } 3.MainActivity实例化一个ClientThread private ClientThread cThread; clientThread = myAppSocket.getThread(); 4.MainActivity定义一个接收消息更新UI的mHandler 然后cThread.setMainActivityHandler(mHandler); 5.在ClientThread里面需要更新Activity的地方sendMessage 在MainActivity的mHandler收到消息更新UI 还有回调应该也可以实现
谢谢谢 ,我按照你的方法试试看。
bhfqbpb 2017-06-25
  • 打赏
  • 举报
回复
把ClientThread.java中的这句 public String reMassage = null; //读取收到的数据 改为: public String reMassage = ""; //读取收到的数据 就好了!基本实现目的了。后续还有些小问题。
bhfqbpb 2017-06-22
  • 打赏
  • 举报
回复
引用 11 楼 Nowshow 的回复:
[quote=引用 8 楼 xj396282771 的回复:]
 // 当用户按下发送按钮后,将用户输入的数据封装成Message
                    // 然后发送给子线程的Handler
                    Message msg = new Message();
                    msg.what = 0x345;
                    // 获取输入内容,转换为字符,去除换行和回车符号
                    msg.obj = input.getText().toString().replaceAll("\r\n", "");
                    myAppSocket.getThread().revHandler.sendMessage(msg);
楼主这里不是用了个revHandler么,其实也就是在你获取到数据的线程中,把所获取的数据放到一个Message实例里面,然后通过revHandler发送出去sendMessage,最后在revHandler这个里面setText出来。不懂Handler就上网查下
MainActivity.java的OnCreate()加入以下代码,能编译,但程序界面无法打开。
 final Handler myHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {
                //如果该消息是本程序所发送的
                if(msg.what == 0x1233)
                {
                    //动态地修改所显示的图片
                    if(!info_server.getText().toString().equals(myAppSocket.getThread().reMassage)) {
                        info_server.append(myAppSocket.getThread().reMassage + "\n");
                    }
                }
            }
        };
        //定义一个定时器,让该计时器周期性地执行指定任务
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                //发送空消息
                myHandler.sendEmptyMessage(0x1233);
            }
        },0,1200);
[/quote] 修改了下,界面能打开了,但连接后,返回MainActivity就退出

 myHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {
                //如果该消息是本程序所发送的
                if(msg.what == 0x1233)
                {
                    //动态获取传递来的服务信息;
                    if(isLinked){
                        info_rec = myAppSocket.getThread().reMassage;
                     //   info_rec="Linked";
                    }
                    if(!tempMsg.equals(info_rec)&&isLinked) {
                        info_server.append(info_rec);
                        tempMsg = info_rec;
                    }
                }
            }
        };
        //定义一个定时器,让该计时器周期性地执行指定任务
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                //发送空消息
                myHandler.sendEmptyMessage(0x1233);

            }
        },0,1200);       
主要问题在这句: info_rec = myAppSocket.getThread().reMassage;
bhfqbpb 2017-06-22
  • 打赏
  • 举报
回复
引用 15 楼 jyh149129 的回复:
推荐你用 service 来处理
用service也面临收到service里的信息,实时刷新界面的问题。
developerzjy 2017-06-22
  • 打赏
  • 举报
回复
简单看了下代码,你java好像也是刚学啊,Activity能拿到ClientThread的实例吧,你好像是这样拿的myAppSocket.getThread() 简单的ClientThread更新MainActivity的思路 1.ClientThread里面定义一个Handler private Handler mainActivityHandler; 2.ClientThread加一个方法 public void setMainActivityHandler(Handler handler){ mainActivityHandler = handler; } 3.MainActivity实例化一个ClientThread private ClientThread cThread; clientThread = myAppSocket.getThread(); 4.MainActivity定义一个接收消息更新UI的mHandler 然后cThread.setMainActivityHandler(mHandler); 5.在ClientThread里面需要更新Activity的地方sendMessage 在MainActivity的mHandler收到消息更新UI 还有回调应该也可以实现
bhfqbpb 2017-06-21
  • 打赏
  • 举报
回复
引用 4 楼 xj396282771 的回复:
info_server.setText(你线程所获取的新数据)
楼主说得更新应该是这个意思吧,不知道楼主这个代码写在哪里。在获取新数据线程的代码中可不行,需要在UI线程中才能执行,所以需要用Handle来处理
Handle如何用,就是MainActivity.java该如何修改,烦请大侠指点,Android的也是刚学,只知道皮毛。
bhfqbpb 2017-06-21
  • 打赏
  • 举报
回复
引用 4 楼 xj396282771 的回复:
info_server.setText(你线程所获取的新数据)
楼主说得更新应该是这个意思吧,不知道楼主这个代码写在哪里。在获取新数据线程的代码中可不行,需要在UI线程中才能执行,所以需要用Handle来处理
相关的代码在这里: https://code.csdn.net/snippets/2451102#nogo 涉及info_server显示的部分是
send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    // 当用户按下发送按钮后,将用户输入的数据封装成Message
                    // 然后发送给子线程的Handler
                    Message msg = new Message();
                    msg.what = 0x345;
                    // 获取输入内容,转换为字符,去除换行和回车符号
                    msg.obj = input.getText().toString().replaceAll("\r\n", "");
                    myAppSocket.getThread().revHandler.sendMessage(msg);
                    // 清空input文本框
                    input.setText("");
                    info_server.append(myAppSocket.getThread().reMassage + "\n");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
但这需要出发send按钮才行!我的目标是不用按钮,实时更新
Jing丶無雙 2017-06-21
  • 打赏
  • 举报
回复
info_server.setText(你线程所获取的新数据)
楼主说得更新应该是这个意思吧,不知道楼主这个代码写在哪里。在获取新数据线程的代码中可不行,需要在UI线程中才能执行,所以需要用Handle来处理
bhfqbpb 2017-06-21
  • 打赏
  • 举报
回复
引用 2 楼 qq_35001400 的回复:
你说的是在线程做操作,然后去更新多个activity吗? 还是楼上说的保持长连接、推送之类的
基本就是这个意思,目前我开启了一个线程,此线程可以实时更新服务器发来的消息,但不能更新界面,尤其是MainActivity这个控制界面的(TextView)info_server,我就想实时更新(TextView)info_server
jyh149129 2017-06-21
  • 打赏
  • 举报
回复
推荐你用 service 来处理
bhfqbpb 2017-06-21
  • 打赏
  • 举报
回复
引用 13 楼 xj396282771 的回复:
明天来帮你看下你的源码吧,今天太忙了
好的,谢谢!
Jing丶無雙 2017-06-21
  • 打赏
  • 举报
回复
明天来帮你看下你的源码吧,今天太忙了
bhfqbpb 2017-06-21
  • 打赏
  • 举报
回复
引用 9 楼 ganshenml 的回复:
为啥你只有点击之后才能更新呢?因为你把数据更新事件放在了点击事件中处理。 1.确定你拿到更新的数据来自于哪块代码; 2.在以上代码中传递数据至要求更新显示的数据页面;
就是因为不能实时更新,所以,没法,才放这里。 现在的问题是该放哪里,怎么放?
bhfqbpb 2017-06-21
  • 打赏
  • 举报
回复
引用 8 楼 xj396282771 的回复:
 // 当用户按下发送按钮后,将用户输入的数据封装成Message
                    // 然后发送给子线程的Handler
                    Message msg = new Message();
                    msg.what = 0x345;
                    // 获取输入内容,转换为字符,去除换行和回车符号
                    msg.obj = input.getText().toString().replaceAll("\r\n", "");
                    myAppSocket.getThread().revHandler.sendMessage(msg);
楼主这里不是用了个revHandler么,其实也就是在你获取到数据的线程中,把所获取的数据放到一个Message实例里面,然后通过revHandler发送出去sendMessage,最后在revHandler这个里面setText出来。不懂Handler就上网查下
MainActivity.java的OnCreate()加入以下代码,能编译,但程序界面无法打开。
 final Handler myHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {
                //如果该消息是本程序所发送的
                if(msg.what == 0x1233)
                {
                    //动态地修改所显示的图片
                    if(!info_server.getText().toString().equals(myAppSocket.getThread().reMassage)) {
                        info_server.append(myAppSocket.getThread().reMassage + "\n");
                    }
                }
            }
        };
        //定义一个定时器,让该计时器周期性地执行指定任务
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                //发送空消息
                myHandler.sendEmptyMessage(0x1233);
            }
        },0,1200);
chickenmay 2017-06-21
  • 打赏
  • 举报
回复
引用 2 楼 qq_35001400 的回复:
你说的是在线程做操作,然后去更新多个activity吗? 还是楼上说的保持长连接、推送之类的
在获取服务器返回的数据后 用handle 去异步处理 需要更新哪些东西 就写哪些。 如果是多个界面,建议你用数据库,更新下数据库,每次进入一个新的activity 就会重新获取数据 避免不必要的操作
加载更多回复(5)

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧