0

readline!= null のスレッド内で setText() メソッドを使用してメッセージを投稿したいのですが、エラーが見つかりました。トーストを表示して setText() メソッドを使用できません。

public void run(){

    Looper.myLooper();
    Looper.prepare();

    try {           
        while(!((line = in.readLine()).equalsIgnoreCase("quit"))){              
            if(line.isEmpty()){
                System.out.println("there is no message");
            }else{                      

     Toast.makeText(this, "Message= " + line , Toast.LENGTH_SHORT).show();
                msgbox.setText(line);
            }               
        }           
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("Gagal mengirim ACK ke server");
    }

}
4

5 に答える 5

2

UIスレッド以外のスレッドでトーストを表示することはできません..そのためにハンドラーを使用するか、この目的のためにrunOnUiThreadを使用できます..

 activity.runOnUiThread(new Runnable() {
public void run() {
    Toast.makeText(youractivity.this, "Message= " + line , Toast.LENGTH_SHORT).show();
            msgbox.setText(line);
}
});
于 2012-05-28T07:01:52.877 に答える
2

あなたのエラーは何ですか?

このコードはそれを解決できますか?

    try {       

            final StringBuffer strMessage = new StringBuffer();

        while(!((line = in.readLine()).equalsIgnoreCase("quit"))){              
            if(line.isEmpty()){
                System.out.println("there is no message");
            }else{                      

            strMessage.append(line)

            this.runOnUiThread(new Runnable() {
        public void run() {
            Toast.makeText(YourActivity.this, "Message= " + line , Toast.LENGTH_SHORT).show();
             msgbox.setText(strMessage.toString());
            //...
                    }
                });

            }               
        }           
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("Gagal mengirim ACK ke server");
    }

runOnUiThread(...) UI スレッドで指定されたアクションを実行します。現在のスレッドが UI スレッドの場合、アクションはすぐに実行されます。現在のスレッドが UI スレッドでない場合、アクションは UI スレッドのイベント キューにポストされます。

于 2012-05-28T07:02:52.457 に答える
1

非メイン スレッドから UI を更新することはできません。ハンドラーと Threadsのいずれかを使用しています。

または、単に彼を試して、このようなアクティビティの obj を作成します。

Activity activityobj= yourActivity;run() 内で使用し、

public void run(){

Looper.myLooper();
Looper.prepare();

try {           
    while(!((line = in.readLine()).equalsIgnoreCase("quit"))){              
        if(line.isEmpty()){
            System.out.println("there is no message");
        }else{                      
     activityObj.runOnUiThread(new Runnable() {

        @Override
        public void run() {
Toast.makeText(this, "Message= " + line ,Toast.LENGTH_SHORT).show();
            msgbox.setText(line);

        }
    });


        }               
    }           
} catch (IOException e) {
    e.printStackTrace();
    System.out.println("Gagal mengirim ACK ke server");
}

}
于 2012-05-28T07:01:11.137 に答える
0

これを試して、

1)クラス内にハンドラーを作成します。

private Handler mHandler = new Handler() {

    public void handleMessage(android.os.Message msg) {

        Toast.makeText(this, "Message= " + line ,Toast.LENGTH_SHORT).show();
        msgbox.setText(line);
    }
};

2)次のようにコードを変更します。

public void run(){

Looper.myLooper();
Looper.prepare();

try {           
    while(!((line = in.readLine()).equalsIgnoreCase("quit"))){              
        if(line.isEmpty()){
            System.out.println("there is no message");
        }else{                      
           mHandler.sendEmptyMessage(0);
        }               
    }           
} catch (IOException e) {
    e.printStackTrace();
    System.out.println("Gagal mengirim ACK ke server");
}

}

于 2012-05-28T07:08:08.497 に答える
0

ここにあります

Handler handler = new Handler();    
public void run(){
Looper.myLooper();
Looper.prepare();
try {           
    while(!((line = in.readLine()).equalsIgnoreCase("quit"))){              
        if(line.isEmpty()){
            System.out.println("there is no message");
        }else{                      
  handler.post(new Runnable() {

                    @Override
                    public void run() {
                         Toast.makeText(this, "Message= " + line , Toast.LENGTH_SHORT).show();
            msgbox.setText(line);
                    }
                });


        }               
    }           
} catch (IOException e) {
    e.printStackTrace();
    System.out.println("Gagal mengirim ACK ke server");
}

}
于 2012-05-28T07:15:13.513 に答える