我写了Android客户端。 ClientThread类实现了Runnable接口,这是run方法:
ClientThread.java
public void run() {
connect(); //connects the server
String msg = ""; //holds the msg recieved from server
try {
while(connected && (msg = br.readLine())!= null)
{
//System.out.println("Server:"+msg);
if (!msg.isEmpty())
creatingActivity.displayServerAnswer("Server:"+msg);
//notify observers//
this.setChanged();
//notify+send out recieved msg to Observers
this.notifyObservers(msg);
}
}
catch(IOException ioe) { }
finally { disconnect(); connected = false; }
}
目的是在设备屏幕上显示服务器答案。
MainActivity.java
public void displayServerAnswer(String answer){
TextView textView = (TextView)findViewById(R.id.mainTextView);
try {
textView.setText(answer);
}
catch(Exception e){
}
}
由于某种原因,当调用textView.setText(answer);
时会抛出异常。我不知道哪种。在我用try-catch块包装行之前,程序停止了运行。
现在我抓住异常并且什么都不做。 即使抛出异常,文本也会设置。
那么如何才能找出这个例外呢?
修改 正如评论中提到的,通过检查异常对象消息字段:
只有创建了视图hirarchy的原始线程才能触及它 视图
所以现在我理解异常,但我不明白为什么它只在第二次抛出,客户端线程调用creatingActivity.displayServerAnswer("Server:"+msg);
答案 0 :(得分:1)
public void displayServerAnswer(String answer){
TextView textView = (TextView)findViewById(R.id.mainTextView);
try {
textView.setText(answer);
}
catch(Exception e){
e.printStackTrace();
}
}
您正在捕获异常但未对其执行任何操作。打印堆栈跟踪将显示引发异常的代码行。
答案 1 :(得分:0)
这是因为您在run方法中设置了后台线程中的文本。 使用runonUithread或handler更改text.inside run方法。:)