【发布时间】:2017-08-21 11:34:39
【问题描述】:
我有一个名为 Player 的类,它在图像中创建 TextView
public Player(String username, boolean isWhite, Context context){
this.username = username;
this.isWhite = isWhite;
this.context = context;
label = new TextView(context);
if(isWhite)
label.setCompoundDrawablesWithIntrinsicBounds(R.drawable.white, 0, 0, 0);
else
label.setCompoundDrawablesWithIntrinsicBounds(R.drawable.black, 0, 0, 0);
label.setText(username);
}
监听器从服务器读取消息
public void run(){
try {
String[] messages;//ci salvo i messaggi che arrivano
//PARTITA
for (messages = ConnectionStream.getIn().readLine().split(":");
!messages[0].equals("ENDGAME"); messages = ConnectionStream.getIn().readLine().split(":")) {
switch (messages[0]) {//scelgo cosa fare a seconda del messaggio
case "ADD"://ADD:NOMEGIOCATORE:NODODIPARTENZA:WHITE/BLACK
game.login(messages[1], messages[3].equals("white"));
game.movePlayer(game.getPlayer(messages[1]), messages[2]);
break;
case "MOVE"://MOVE:GIOCATORE:NODO
game.movePlayer(game.getPlayer(messages[1]), messages[2]);
break;
case "REMOVE"://REMOVE:GIOCATORE
game.logout(game.getPlayer(messages[1]));
break;
case "DUEL"://DUEL:GIOCATORENEMICO
/*vertexListener.setDueling(true);//finchè duello non posso spostarmi
duel = new DuelFrame(frame, messages[1], connectionStream.getOut());
SwingUtilities.invokeAndWait(duel);*/
break;
case "ENDDUEL":
/*if(duel!=null)
duel.removeDuel();
duel = null;
vertexListener.setDueling(false);//ora posso spostarmi
break;*/
case "SETBULLETS"://SETBULLETS:INT
game.setBullets(Integer.parseInt(messages[1]));
break;
case "ADDBULLETS"://ADDBULLETS:INT
game.addBullets(Integer.parseInt(messages[1]));
break;
default:
throw new Exception("Server sent weird command: " + messages[0]);
}
}
}catch(Exception e){
e.printStackTrace();
game.showError(e.toString());
}
}
当我收到 MOVE:PLAYER:NODE 消息时,调用函数 move(Player player, String node)
public void movePlayer(final Player player, String node){
final RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(PLAYER_WIDTH, PLAYER_HEIGHT);
Point point = nodes.get(node);
params.leftMargin = point.x;
params.topMargin = point.y+NODE_HEIGHT;
final RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout);
runOnUiThread(new Runnable(){
@Override
public void run(){
layout.addView(player.getLabel(), params);
}
});
}
我的问题是 runOnUiThread 崩溃,我什至不知道为什么。我试图用 try-catch 包围它并且不使用 runOnUiThread (这给了我一个例外“只有视图的所有者才能触摸它”)。有没有办法在这个多线程应用程序中找到错误?
【问题讨论】:
-
你能发布你的 logcat 吗?
-
我不能,因为当我的应用程序崩溃时,它会自行重启并删除我的 logcat
-
在您的 logcat 中不选择过滤器,而不是 Show only selected application
-
感谢您的评论,我通过阅读异常解决了问题,谢谢!
标签: java android multithreading view