2017-08-21 132 views
-2

我有一個叫播放器類的圖像RunOnUiThread,嘗試添加一個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); 
} 

與聽衆中創建的TextView從服務器讀取

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(播放器播放器,String節點)被稱爲

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); 
      } 
     }); 
    } 

我的pro blem是runOnUiThread崩潰,我甚至不知道爲什麼。我嘗試用try-catch包圍它,並且不使用runOnUiThread(這給了我例外「只有視圖的所有者才能觸摸它」)。有沒有什麼方法可以在這個多線程應用程序中找到錯誤?

+3

你可以發表你的logcat的? –

+0

我不能,因爲當我的應用程序崩潰,它本身重啓,刪除我的logcat –

+0

選擇您logcat的,而不是隻顯示選定的應用 –

回答

0

我才發現原來我是想補充一點,TWAS已顯示一個視圖,這引起了問題

0

它運行在一個新線程的弟弟。如下圖所示:

new Thread(new Runnable() { 
     public void run() { 

      try { 

       YourActivity.this.runOnUiThread(new Runnable() { 
        public void run() { 

         layout.addView(player.getLabel(), params); 
        } 
       }); 

      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.e("addView_EX", e + " +++++"); 
      } 
     } 
    }).start(); 
+0

這並沒有解決問題,還是要謝謝你 –

+0

好吧,那麼就嘗試調用線程,在那裏你調用方法裏面的'movePlayer'方法。並刪除方法內的線程。 – sam