2
我在非UI线程中创建一组webview对象,并在webview的页面加载完成后继续将其添加到队列中。 UI线程最终将查询webview,并且如果维护队列中有元素,它将从队列中挑选出来。此非UI线程将保持永久运行,并在需要时填充队列&。不幸的是,当UI线程呈现webview时,虽然它被正确渲染,但非UI线程突然失败并出现“CalledFromWrongThreadException”错误。我不确定这种行为是否预期。我创建了一个示例程序来演示相同。有人能帮我在这里找出问题吗?在非UI线程中构造视图并在UI线程中使用
public class MultiThreadTest extends Activity {
private volatile WebView mWv;
private LinearLayout mLL;
private volatile Handler nonUiThreadHandler = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mLL = (LinearLayout) findViewById(R.id.linearLayout);
Button creator = (Button) findViewById(R.id.creator);
creator.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
createThread();
}
});
Button consumer = (Button) findViewById(R.id.consumer);
consumer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mLL.addView(mWv, new LinearLayout.LayoutParams(200, 200));
mWv.requestFocus();
}
});
}
public void createThread() {
Thread t = new Thread (new Runnable() {
@Override
public void run() {
Looper.prepare();
nonUiThreadHandler = new Handler();
Looper.loop();
}
}, "Creator thread");
t.start();
while (!t.isAlive() || nonUiThreadHandler==null) {}
nonUiThreadHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
constructView();
}
});
}
public void constructView() {
mWv = new WebView(MultiThreadTest.this);
mWv.setWebChromeClient(new WebChromeClient());
mWv.loadUrl("http://www.yahoo.com");
mWv.setFocusable(true);
}
}
您也可以使用'runOnUiThread()',它执行相同的操作,但没有处理程序。 – bigstones 2011-03-12 19:00:45
是必须在他们将显示的线程上构建视图。 – hackbod 2011-03-12 19:47:28
@anothem谢谢指出。是的,我知道这个限制。这就是我从UI线程中完成以下几行的确切原因。 mLL.addView(mWv,new LinearLayout.LayoutParams(200,200)); mWv.requestFocus(); (2/3) (1/2) – 2011-03-14 05:59:36