Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android中消息和字符串之间的转换?_Java_Android_Multithreading_Network Programming_Handler - Fatal编程技术网

Java android中消息和字符串之间的转换?

Java android中消息和字符串之间的转换?,java,android,multithreading,network-programming,handler,Java,Android,Multithreading,Network Programming,Handler,我正在尝试监视android上的网络连接。这不能在主线程上完成,因此数据收集发生在我生成的单独线程上,我正在学习使用Handler类每秒向UI报告。下面是我的代码的相关片段 public class MainActivity extends Activity { private TextView textView; private int linkSpeed; Handler handler = new Handler() { @Override

我正在尝试监视android上的网络连接。这不能在主线程上完成,因此数据收集发生在我生成的单独线程上,我正在学习使用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()方法,但它返回的是描述,而不是消息包含的内容。我还对如何将字符串转换为消息感到困惑——我觉得我在做一个非常迂回的方法。任何帮助都将不胜感激

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

我创建了以下示例:

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();
    }
}

您不必在
字符串
消息
之间进行重载或任何转换。 您应该做的是将该字符串放入Message类型的对象中,并将其发送到
处理程序
。然后在
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()中:

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

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

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

我让它工作了。这真的很简单,很有帮助,非常感谢!我实际上并没有使用handler类,我只是在try块中调用runOnUiThread来显示来自主线程的文本。
while (true) {
    WifiInfo s = wifiManager.getConnectionInfo();
    //..
}
String message = "linkSpeed = " + linkSpeed; // This line never won't be reached.