qq_21208263 2015-07-26 07:19 采纳率: 0%
浏览 2745

Android handleMessage()在OnCreate之后执行?

我的程序需要用子线程向网络获取数据并保存到MainActivity中。代码大概是这样的

public class MainActivity  {
private Timer timer;
public MyHandler handler;
private String js;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         handler = new MyHandler();
         timer = new Timer();  

         getAllInfo();

        //延迟5秒等待getAllInfo(); 如果去掉该语句,数据将不能从网络获取到
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


         System.out.println("js = " + js);      
         System.out.println("OnCreate OVER); 
        }


        //利用计时器,两分钟联网获取一次数据
        private void getAllInfo(){
        timer.schedule(new java.util.TimerTask(){
        @Override
        public void run()
             { 
              System.out.println("Id:" + Thread.currentThread().getId());
          String data;
          // 

          联网获取数据的代码 ....  data = .....

         //

                Message msg = Message.obtain(handler, 1 , data);
                handler.removeMessages(0);
                msg.sendToTarget();

                System.out.println("SEND SUCCEED " + data);

            } 
          }, 0, 120*1000);  

        }

        //自定义Handler类
        private class MyHandler extends Handler
    {   
        public MyHandler() { 
        } 

        @Override
       public void handleMessage(Message msg) {  
           super.handleMessage(msg);

            System.out.println("handleMessage START");
            //更新数据的值
      js =  msg.obj.toString;
          System.out.println(js);
          System.out.println("handleMessage OVER");
            }  
      };  
}

程序运行后输出结果为:
id:617
SEND SUCCEED data(这里data已经是网络上获取到的数据)
js =

OnCreate OVER
handleMessage START
data(这里data已经是网络上获取到的数据)
handleMessage OVER

可以看到js = ,并没有拿到值
再往下看handleMessage()竟然在OnCreate()执行完毕之后才执行,然后js拿到了值,但是现在拿到已经没用了……OnCreate()已经结束
所以为什么handleMessage()不是接受到 msg.sendToTarget()的消息之后立即执行的呢?这样我的Activity中的js就没法获取到数据显示在界面上了
工期限制,急求大神解答!!

  • 写回答

3条回答 默认 最新

  • danielinbiti 2015-07-26 08:36
    关注

    handler是异步处理消息机制,如果通过消息,在handleMessage中收到消息再处理才是完全靠谱的操作。把界面初始化放在handleMessage中处理吧。

    评论

报告相同问题?

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向