有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓中消息和字符串之间的java转换?

我正在尝试监视安卓上的网络连接。这不能在主线程上完成,因此数据收集发生在我生成的单独线程上,我正在学习使用Handler类每秒向UI报告。下面是我的代码的相关片段

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”类型的,但我似乎无法重载处理程序类中的handleMessage方法以获取字符串而不是消息。我不认为字符串和消息之间存在直接转换,因为消息类中唯一返回字符串的方法是toString()方法,但它返回的是描述,而不是消息包含的内容。我还对如何将字符串转换为消息感到困惑——我觉得我在做一个非常迂回的方法。任何帮助都将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    您可以使用捆绑包将对象(如字符串)附加到消息对象

    我创建了以下示例:

    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();
        }
    }
    
  2. # 2 楼答案

    您不必重载或尝试在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
    //....
    

    在{}中:

    @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,否则即使在应用程序关闭后它也会继续运行