我对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。
我该怎么办?
答案 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));
});
}
}
}
并且,如果您需要在屏幕上进行快速更新,则可以使用SurfaceView
。 SurfaceView
与ui线程无关。所以,你可以在这个对象中做任何你想做的事情。但是,绘制对象很简单。所以,你只能在这个对象上绘制一些几何形状。
答案 1 :(得分:0)
这里的解决方案是在UI线程和其他线程之间使用Handler:
https://developer.android.com/training/multiple-threads/communicate-ui.html
你需要做的是在UI线程上定义一个处理来自其他线程的传入消息的处理程序。