2013-06-28 2 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(); 
    } 

Проблема заключается в том, сообщение, которое я получаю от нового потока I нерест имеет тип «String», но я не могу перегрузить метод handleMessage в обработчике класс, чтобы принимать строки вместо сообщений. Я не думаю, что существует прямая конверсия между строками и сообщениями, поскольку единственным методом класса Message, возвращающим String, является метод toString(), но он возвращает описание, а не то, что содержит сообщение. Я также смущен тем, как я могу преобразовать String в Message - и я чувствую, что делаю очень окольный подход. Любая помощь будет принята с благодарностью!

ответ

16

Вы не должны перегружать или попытаться сделать какие-либо coversions между String и Message. Что вы должны сделать, это поместить эту String в объект типа 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. 

Кроме того, не забудьте остановиться на op Thread, в противном случае он будет продолжать работать даже после закрытия приложения.

+0

Я получил его для работы. Это было очень просто и полезно, спасибо! Я фактически не использовал класс обработчика, я просто вызвал runOnUiThread в блоке try, чтобы отображать тексты из основного потока. –

6

Вы можете прикреплять объекты - например, вашу String - к объектам Message с помощью Bundle.

Я создал этот пример:

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