8

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

問題は、生成した新しいスレッドから取得するメッセージが「文字列」型であるということですが、Handler クラスの handleMessage メソッドをオーバーロードして、メッセージの代わりに文字列を受け取ることができないようです。String を返す Message クラスの唯一のメソッドは toString() メソッドであるため、String と Message の間に直接的な変換があるとは思いませんが、メッセージに含まれるものではなく、説明を返します。また、文字列をメッセージに変換する方法についても混乱しています。非常に遠回りのアプローチをしているように感じます。どんな助けでも大歓迎です!

4

2 に答える 2

9

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();
    }
}
于 2013-06-28T20:40:22.023 に答える