具有无限循环和UI的Android线程

时间:2014-11-28 14:07:30

标签: android multithreading webview bluetooth lejos-nxj

我对Android很新,但我还没有获得Android线程的想法。

这里我有BtConnection课程,通过蓝牙与乐高NXT进行交流。我想根据NXT的消息更改我的webView。我想在收到任何消息后立即更改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。 我该怎么办?

2 个答案:

答案 0 :(得分:1)

Android只有一个ui调度程序线程用于ui操作和安全机制(如果在ui线程中没有执行操作则抛出异常)。因此,如果要更新ui,则必须在调度程序线程中执行此操作。您可以使用此处理程序,也可以使用简单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));
              });
        }
    }
 }

并且,如果您需要在屏幕上进行快速更新,则可以使用SurfaceViewSurfaceView与ui线程无关。所以,你可以在这个对象中做任何你想做的事情。但是,绘制对象很简单。所以,你只能在这个对象上绘制一些几何形状。

答案 1 :(得分:0)

这里的解决方案是在UI线程和其他线程之间使用Handler

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

你需要做的是在UI线程上定义一个处理来自其他线程的传入消息的处理程序。