8

一旦消息被发送到套接字,我想显示一个祝酒词。在这个“Log.d(“ClientActivity”,“C:Sent。”)之后;“

我是否需要创建一个单独的线程来显示 Toast?

public class ClientActivity extends Activity {
private Handler handler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.client);
    serverIp = (EditText) findViewById(R.id.EditText01);
    message =(EditText) findViewById(R.id.EditText02);
    connectPhones = (Button) findViewById(R.id.Button01);

}

    public void Click1(View v) {
        if (!connected) {
            serverIpAddress = serverIp.getText().toString();
            if (!serverIpAddress.equals("")) {
                Thread cThread = new Thread(new ClientThread());
                cThread.start();
            }
        }
    }


private class ClientThread implements Runnable {

    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d("ClientActivity", "C: Connecting...");
            Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT);
            connected = true;
            while (connected) {
                try {
                    if(i>5)
                    {


                    } 
                    else
                    {   
                        Log.d("ClientActivity", "C: Sending command.");
                        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                                .getOutputStream())), true);
                        // where you issue the commands
                        message1= message.getText().toString();
                        out.println(message1);
                        i=i+1;
                        Log.d("ClientActivity", "C: Sent.");
                    }    
                } catch (Exception e) {
                    Log.e("ClientActivity", "S: Error", e);
                }
            }
            socket.close();
            Log.d("ClientActivity", "C: Closed.");
        } catch (Exception e) {
            Log.e("ClientActivity", "C: Error", e);
            connected = false;
        }
    }
}

}

4

4 回答 4

21

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

                     Toast.makeText(ClientActivity.this,"asdf",Toast.LENGTH_LONG).show();
                }
            });

在这条线之后

  Log.d("ClientActivity", "C: Connecting...");
于 2012-05-16T01:51:33.557 回答
3
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        System.out.println("I'm in handler");
        Toast.makeText(YourActivity.this, "This is a toast", Toast.LENGTH_SHORT).show(); 
    }
}, 1000);             
于 2012-05-16T04:53:35.760 回答
3

您不能从线程内部创建 toast。因为这个新线程无权访问getApplicationContext()您传递给它的那个。您必须以某种方式建立与 UI 线程(即主线程)的通信。
因此,每当您想敬酒时,请在该handler.Post(Runnable)方法中进行。处理程序是middle manUI 线程和您正在运行的单独线程之间的。所有 UI 操作都必须在handler.Post(Runnable)'run()方法中完成。

因此,在您显示敬酒的活动中,请执行以下操作:

private class ClientThread implements Runnable {

    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
             .....
             .....
              message1= message.getText().toString();
                        out.println(message1);
                        i=i+1;
                        Log.d("ClientActivity", "C: Sent.");
                        handler.post(new Runnable(){
                          public void run()
                          {
                             Toast.make(....);
                           }
                         });

不要忘记在主活动中声明和初始化一个处理程序对象(在线程外)

handler=new Handler();
于 2012-05-17T09:59:59.613 回答
1

先声明一个全局Handler,

Handler handler=null;

然后像这样在你的 onCreate() 中创建一个处理程序,

Handler handler=new Handler()
{
  public void handleMessage(Message msg)
{
  if(msg.what==0)
{
   Toast.makeText(ClientActivity.this,"Your Toast Mesage Goes here",Toast.LENGTH_LONG).show();
}

}
};

现在在你的 Runnable 类中添加这一行"Log.d("ClientActivity", "C: Sent.");"

handler.sendEmptyMessage(0);

您面临的问题是因为您无法从 runnable 更新 UI。处理程序将您连接到您的主 UI。因此,您必须从 Runnable 将消息传递给您的处理程序。

于 2012-05-16T04:20:20.800 回答