【问题标题】:Conversion between Message and String in android?android中Message和String之间的转换?
【发布时间】:2013-06-28 20:05:14
【问题描述】:

我正在尝试监控 android 上的网络连接。这不能在主线程上完成,因此数据收集发生在我生成的单独线程上 - 我正在学习使用 Handler 类每秒向 UI 报告。这是我的代码的相关sn-ps...

public class MainActivity extends Activity {
    private TextView textView;
    private int linkSpeed;
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Message message = msg;
            textView.setText(message);
            setContentView(textView);

        }
    };

    /** Called when the activity is created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);
        textView = new TextView(this);
        textView.setTextSize(25);

        Thread thread = new Thread() {
            public void run() {
                for (;;) {
                    try {
                        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
                        while (true)
                        {
                            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                            if (wifiInfo != null) {
                                linkSpeed = wifiInfo.getLinkSpeed(); //measured using WifiInfo.LINK_SPEED_UNITS
                            }
                            else {
                                linkSpeed = -1;
                            }

                    }
                        String message = "linkSpeed = " + linkSpeed;
                        handler.handleMessage(message);
                        Thread.sleep(1000);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        };

        thread.start();
    }

问题是,我从生成的新线程获得的消息是“String”类型的,但我似乎无法重载 Handler 类中的 handleMessage 方法来获取字符串而不是消息。我认为字符串和消息之间没有直接的转换,因为 Message 类中唯一返回字符串的方法是 toString() 方法,但它返回的是描述,而不是消息包含的内容。我也对如何将字符串转换为消息感到困惑——我觉得我正在做一个非常迂回的方法。任何帮助将不胜感激!

【问题讨论】:

    标签: java android multithreading network-programming handler


    【解决方案1】:

    您不必超载或尝试在StringMessage 之间进行任何覆盖。 您应该做的是将该字符串放入 Message 类型的对象中并将其发送到Handler。然后在handleMessage() 从消息中提取字符串。

    类似这样的:

    // ....
    String message = "linkSpeed = " + linkSpeed;
    Message msg = Message.obtain(); // Creates an new Message instance
    msg.obj = message; // Put the string into Message, into "obj" field.
    msg.setTarget(handler); // Set the Handler
    msg.sendToTarget(); //Send the message
    //....
    

    handleMessage():

    @Override
    public void handleMessage(Message msg) {
        String message = (String) msg.obj; //Extract the string from the Message
        textView.setText(message);
        //....
    }
    

    但除此之外,程序还有一个问题:您将无法将数据发送到处理程序,因为那部分代码无法访问:

    while (true) {
        WifiInfo s = wifiManager.getConnectionInfo();
        //..
    }
    String message = "linkSpeed = " + linkSpeed; // This line never won't be reached.
    

    另外,不要忘记在某个时候停止Thread,否则即使在应用关闭后它也会继续运行。

    【讨论】:

    • 我让它工作了。这真的很简单而且很有帮助,非常感谢!我实际上并没有使用处理程序类,我只是在 try 块中调用 runOnUiThread 来显示来自主线程的文本。
    【解决方案2】:

    您可以使用 Bundle 将对象(如字符串)附加到 Message 对象。

    我已经创建了这个例子:

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    
    public class MainActivity extends Activity {
    
        Handler handler = new Handler()
        {
            @Override
            public void handleMessage(Message msg) {
                Bundle bundle = msg.getData();
    
                String text = bundle.getString("key");
    
                // text will contain the string "your string message"
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Thread thread = new Thread()
            {
                @Override
                public void run() {
                    Message message = handler.obtainMessage();
    
                    Bundle bundle = new Bundle();
                    bundle.putString("key", "your string message");
    
                    message.setData(bundle);
    
                    handler.sendMessage(message);
                }
            };
    
            thread.start();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多