Yue*_*Hsi 7 java multithreading android network-programming handler
我正在尝试监控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();
}
Run Code Online (Sandbox Code Playgroud)
问题是,我从我生成的新线程获得的消息是"String"类型,但我似乎无法重载Handler类中的handleMessage方法来获取字符串而不是消息.我不认为在字符串和消息之间存在直接转换,因为Message类中返回String的唯一方法是toString()方法,但它返回描述,而不是消息包含的内容.我也很困惑我如何将一个字符串转换为一个消息 - 我觉得我正在做一个非常迂回的方法.任何帮助将不胜感激!
And*_*Res 19
您不必超载或尝试在String和之间进行任何覆盖Message.你应该做的是将String放入Message类型的对象中并将其发送给Handler.然后handleMessage()从Message 中提取String.
像这样的东西:
// ....
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
//....
Run Code Online (Sandbox Code Playgroud)
并在handleMessage():
@Override
public void handleMessage(Message msg) {
String message = (String) msg.obj; //Extract the string from the Message
textView.setText(message);
//....
}
Run Code Online (Sandbox Code Playgroud)
但除此之外,程序还有一个问题:您将无法将数据发送到处理程序,因为代码的这部分是无法访问的:
while (true) {
WifiInfo s = wifiManager.getConnectionInfo();
//..
}
String message = "linkSpeed = " + linkSpeed; // This line never won't be reached.
Run Code Online (Sandbox Code Playgroud)
此外,不要忘记Thread在某个时间停止,否则即使应用程序关闭后它仍将继续运行.
您可以使用Bundle将对象(如String)附加到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();
}
}
Run Code Online (Sandbox Code Playgroud)