2013-06-28 46 views
4

我正试图监视android上的网络连接。这不能在主线程中完成,因此数据收集发生在我产生的单独线程上 - 而且我正在学习使用Handler类每秒向用户界面报告。这里是我的代码的相关片段...在android中的消息和字符串之间的转换?

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

的问题是,我在新的线程我产卵得到消息的类型是“字符串”,但我似乎不能超载的handleMessage方法在处理程序类使用字符串而不是消息。我不认为字符串和消息之间有直接的转换,因为Message类中返回String的唯一方法是toString()方法,但它返回一个描述,而不是消息包含的内容。我也对如何将字符串转换为消息感到困惑 - 我觉得我正在做一个非常迂回的方法。任何帮助将不胜感激!

回答

16

您没有超载或尝试做StringMessage之间的任何coversions。 你应该做的是将该字符串放入消息类型的对象中并将其发送到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. 

另外,别忘了st在某些时候运行Thread,否则在应用程序关闭后它会继续运行。

+0

我得到它的工作。这真的很简单,很有帮助,谢谢!我没有真正使用处理器类,我只是在try块中调用runOnUiThread来显示主线程中的文本。 –

6

您可以使用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(); 
    } 
} 
相关问题