Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试添加文本视图的RunOnUiThread崩溃_Java_Android_Multithreading_View - Fatal编程技术网

Java 尝试添加文本视图的RunOnUiThread崩溃

Java 尝试添加文本视图的RunOnUiThread崩溃,java,android,multithreading,view,Java,Android,Multithreading,View,我有一个名为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) labe

我有一个名为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);
            }
        });
    }

我的问题是RunNuithread崩溃了,我甚至不知道为什么。我试图用try-catch来包围它,并且不使用runOnUiThread(这给了我一个例外“只有视图的所有者才能触摸它”)。有没有办法找到这个多线程应用程序中的错误?

在新的线程上运行它。如下图所示:

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

我发现我试图添加一个twas已经显示的视图,这导致了问题

你能发布你的logcat吗?我不能,因为当我的应用程序崩溃时,它会自动重新启动并删除我的logcat在你的logcat中不选择过滤器,而不是只显示选定的应用程序我通过阅读异常解决了问题,感谢你的评论,非常感谢。好的,然后试着在线程内调用
movePlayer
方法,在这里调用该方法。并移除方法内部的线程。