我创建了一个Handler
可以从活动中的任何地方访问的,还编写了一个方法来更容易调用处理程序:
private Handler textFromBGThread = new Handler() {
@Override
public void handleMessage (Message msg) {
// Get the string from the msg
String outputString = msg.getData().getString("Output");
// Find the TextView
TextView Output = (TextView)findViewById(R.id.ConsoleOutputView);
// Display the output
Log.i("TextOutput","About to display message: " + outputString);
Output.setText(Output.getText() + outputString);
Log.i("TextOutput","Message displayed");
}
};
private void TextOutputWrapper (String outputText) {
Message msg = new Message();
Bundle bndle = new Bundle();
bndle.putString("Output", "\n" + outputText);
msg.setData(bndle);
textFromBGThread.handleMessage(msg);
}
那么这可以从后台线程简单地调用:
TextOutputWrapper("Attemping to connect...");
这将工作 1 次以上,但是,实际的视觉变化会导致 aCalledFromWrongThreadException
被抛出。作为 Java 和 Android 的新手,我不知道为什么会发生这种情况。
我注意到,当呼叫之间的时间稍长时,崩溃往往会发生,如果呼叫TextOutputWrapper(String)
一个接一个地发生得非常快,那么它就会起作用。例如,这个:
int i = 0;
while (i < 200) {
TextOutputWrapper(String.valueOf(i));
i++;
}
工作正常。
查看 LogCat 后,似乎垃圾收集器释放了一些资源,然后在下一次TextOutputWrapper(String)
被调用时,它崩溃了(Output.SetText(String)
准确地说是在调用时),尽管我不确定为什么会导致这个错误。