1

私は Android にかなり慣れていないので、Android スレッドのアイデアをまだ理解していません。

ここにBtConnection、Bluetooth 経由で Lego NXT と通信するクラスがあります。webViewNXTからのメッセージに合わせて変更したいです。webViewメッセージが来たらすぐに変更したい。このような

class BtConnection implements Runnable {

    @Override
    public void run() {
        NXTConnector conn = new NXTConnector();
        dos = new DataOutputStream(conn.getOutputStream());
        dis = new DataInputStream(conn.getInputStream());

        while(true){
            int nextPageIndex = dis.readInt();
            webView.loadUrl(indexToUrl(nextPageIndex));
        }
    }
}

その後...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.webView);

    webView.loadUrl("file:///android_asset/html/index.html");

    new Thread(new BtConnection()).start(); 
}

しかし、これは間違っています。なぜなら、new Thread(new BtConnection())UI に触れることができないからです。私は何をすべきか?

4

2 に答える 2

1

Android には、UI 操作用の UI ディスパッチャー スレッドが 1 つしかなく、そのための安全なメカニズムがあります (操作が UI スレッドで実行されない場合は例外をスローします)。したがって、UI を更新する場合は、ディスパッチャー スレッドで行う必要があります。このハンドラに を使用するか、 easy を使用できActivity.runOnUiThreadます。したがって、コードでは、

class BtConnection implements Runnable {

    @Override
    public void run() {
        NXTConnector conn = new NXTConnector();
        dos = new DataOutputStream(conn.getOutputStream());
        dis = new DataInputStream(conn.getInputStream());

        while(true){
            runOnUiThread(new Runnable(){
              run(){
                 int nextPageIndex = dis.readInt();
                webView.loadUrl(indexToUrl(nextPageIndex));
              });
        }
    }
 }

また、画面をすばやく更新する必要がある場合は、 を使用できますSurfaceViewSurfaceViewui スレッドにバインドされていません。したがって、このオブジェクトでやりたいことが何でもできます。しかし、それは単純な描画オブジェクトです。したがって、このオブジェクトにはいくつかの幾何学的形状しか描画できません。

于 2014-11-28T14:48:52.537 に答える
0

ここでの解決策は、UI スレッドと他のスレッドの間でHandlerを使用することです。

https://developer.android.com/training/multiple-threads/communicate-ui.html

あなたがしなければならないことは、他のスレッドからの着信メッセージを処理する UI スレッドでハンドラーを定義することです。

于 2014-11-28T14:34:32.633 に答える