2012-05-16 32 views
6

Tôi muốn hiển thị một bánh mì nướng khi tin nhắn được gửi đến một ổ cắm. Sau "Log.d (" ClientActivity "," C: Sent. ");"Làm thế nào để hiển thị một Toast bên trong một Handler/thread?

Tôi có cần tạo chuỗi riêng để hiển thị Bánh mì nướng không?

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

}

Trả lời

17

đặt

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

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

sau dòng này

Log.d("ClientActivity", "C: Connecting..."); 
+0

Nó vẫn ném một thông báo lỗi "Phương thức makeText (Ngữ cảnh, CharSequence, int) trong loại Bánh mì nướng không áp dụng cho các đối số (Runnable mới() {}, String, int)" – Shan

+0

lỗi là gì? – 5hssba

+0

Đã thêm lỗi – Shan

1

Khai báo một Handler toàn cầu đầu tiên,

Handler handler=null; 

Sau đó Tạo một handler trong onCreate() của bạn như thế này,

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

} 
}; 

Và bây giờ trong lớp Runnable của bạn thêm dòng này sau khi "Log.d("ClientActivity", "C: Sent.");"

handler.sendEmptyMessage(0); 

Vấn đề bạn đang phải đối mặt là bởi vì bạn không thể cập nhật giao diện người dùng từ runnable. Trình xử lý kết nối bạn với giao diện người dùng chính của bạn. Vì vậy, bạn phải truyền một thông điệp tới trình xử lý của bạn từ Runnable của bạn.

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 toast",Toast.LENGTH_SHORT); 
    } 
}, 1000);    
+1

Nếu bối cảnh là một Hoạt động (như bạn đã ngụ ý với YourActivity.this), bạn chỉ có thể sử dụng runOnUiThread(), phải không? –

+0

@DavidDoria bạn nói đúng, vì trình xử lý chỉ sử dụng để thực hiện bất kỳ thay đổi ui nào và khi bạn thấy thực thi phương thức runOnUiThread, trước tiên hãy kiểm tra luồng hiện tại là luồng ui hay không và nếu chuỗi hiện tại không phải là chủ đề ui thì nó được giao nhiệm vụ trong trình xử lý . – itechDroid

+0

Hãy nhớ gọi .show() trên Bánh mì nướng được tạo. –

2

Bạn không thể tạo bánh mì nướng từ bên trong một sợi. Bởi vì chủ đề mới này không có quyền truy cập vào các getApplicationContext() mà bạn chuyển sang nó. Bạn bằng cách nào đó phải establesh một giao tiếp với thread UI (tức là chủ đề chính).
Vì vậy, bất cứ khi nào bạn muốn nướng bánh mì, hãy làm theo phương pháp handler.Post(Runnable). Trình xử lý là middle man giữa chuỗi giao diện người dùng và chuỗi riêng mà bạn đang chạy. Tất cả hoạt động UI sẽ phải được thực hiện theo phương thức của handler.Post(Runnable).

Vì vậy, trong hoạt động của bạn để hiển thị một bánh mì nướng làm điều này:

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

Đừng quên để khai báo và khởi tạo một đối tượng điều khiển các hoạt động chính của bạn (bên ngoài thread)

handler=new Handler(); 
Các vấn đề liên quan