2 qq 21208263 qq_21208263 于 2015.07.26 15:19 提问

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
danielinbiti   Ds   Rxr 2015.07.26 16:36

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

danielinbiti
danielinbiti 回复qq_30137133: 异步和联网有什么关系,
接近 3 年之前 回复
qq_30137133
qq_30137133 都是联网获取数据然后刷新界面的啊
接近 3 年之前 回复
hi_wxb
hi_wxb   2015.07.28 14:26
  1. onCreate中的哪个sleep(5000)赶紧去掉吧,太影响流畅性。如果手机配置差的话,可能直接就ANR了
  2. 填充网络数据的操作别放在onCreate中,可以给一个默认值,然后在handler中 拿到正确数据后再更新UI
cq361106306
cq361106306   2016.07.12 17:27

需要了解Looper这个东西,是在初始化完成调用后,一直死循环的一个东西。一直等待事件驱动。 如果先进行handle,那就提前卡在死循环了,oncreate就没法执行了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
当执行了finish()之后,该activity又执行了oncreate(),再finish()才退出。
考虑androidmainfest.xml中该activity的启动模式,如果是singleTop,考虑改为singeTask再试一下。
activity反复进入onDestroy onCreate方法
问题:pad平放在桌子上,无任何操作,activity会反复进入onDestroy onCreate方法 加了此属性android:configChanges="keyboardHidden|orientation",好了,可是我并没有进行横竖屏切换 activity中注册了180度重力感应的代码new MySensorEventListener(this).register();  可是
onActivityResult会执行onCreate()生命周期
困扰了好久的bug,发现基础没打好
Android——使用Handle和Message更新UI控件
最近在写一个使用Android端访问PCweb服务端的测试应用,需要在进行网络通信,而android网络通信需要异步执行,一开始是直接用AsyncTask的方法在MainActivity中写代码,一切正常,通过AsyncTask 的onPostExecute方法进行界面更新,但为了代码的可复用,采用将网络通信放到另外一个HttpUtils.java类中作为静态方法调用。此时出了一些问题: 1.不知
Activity的onCreate中启动新的Activity时生命周期
Activity的onCreate中启动新的Activity时生命周期
Activity中的onCreate方法不执行问题
Activity中的onCreate方法不执行
【Android实战】----调用startActivityForResult()后,onActivityResult()立即执行的问题
一、问题描述 遇到该问题两次了,决定在此记录,以观后效。问题现象就是题目中所说:调用startActivityForResult()后,onActivityResult()立即执行的问题 二、代码配置 Activity调用 Intent intent = new Intent(activity,InvoiceActivity.class); int
当程序为横屏时,锁屏再开启会被销毁并重新执行onCreate的解决
当程序为横屏时,锁屏再开启会被销毁并重新执行onCreate的解决
android 关于home键退出,重新进入,onCreate二次调用
activity             android:name="com.feiyue.MainActivity"             android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize"             android:screenOrientation=
activity调用onCreate()方法后没有调用onStart()方法
首先写了个空白的activity来进行测试:package com.example.mytestdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class TestOnCreateActivity extends Ap...