2010-10-26 36 views
9

Tôi có một dịch vụ giám sát kết nối ổ cắm. Khi kết nối bị mất, nó cần hiển thị một Toast thông báo cho người dùng rằng nó đang kết nối lại. Điều này làm việc tốt lần đầu tiên. Sau đó tôi thấy enqueueToast trong nhật ký nhưng bánh mì nướng không được hiển thị. Bất kỳ ý tưởng được đánh giá cao. Tôi nghĩ rằng đây sẽ là một điều dễ dàng để thêm vào, nhưng tôi phải thiếu một cái gì đó.Bánh mì nướng Android bắt đầu từ Dịch vụ chỉ hiển thị khi

nhập Đăng

INFO/NotificationService (118): enqueueToast pkg = com.abc [email protected] thời gian = 1

Mã gọi Toast

public class ConnectionService extends Service 
{ ..... 

public void restartConnection() 
{ 
    try 
    { 
    Log.i(this.toString(), "Attempting to reconnect..."); 

    // increase the wait between each retry until the max is reached 
    int sleepTime = reconnectCounter * MIN_RECON_WAIT; 

    if (sleepTime > MAX_RECON_WAIT) 
    { 
     sleepTime = MAX_RECON_WAIT; 
    } 

    String msg = "The connection has been lost. Restart attempt will start in: " + sleepTime/1000 + " seconds"; 

    Log.i(this.toString(), msg); 
    Toast.makeText(getApplicationContext(), msg , Toast.LENGTH_LONG).show(); 

    Thread.sleep(sleepTime); 

    // increment the counter 
    reconnectCounter++; 

    this.startConnectionThread(); 

    } 
    catch (Exception e) 
    { 
     Log.e(this.toString(), "Exception: " + e.toString()); 
     e.printStackTrace(); 
    } 
}// end retartConnection 
+0

Đó có thể là vấn đề về luồng. Bạn đang gọi Toast.show() từ chuỗi giao diện người dùng hoặc từ một chuỗi riêng biệt? Bạn có thể cung cấp thêm một chút ngữ cảnh cho phương pháp này không. – Vuk

+0

Điều này được gọi từ bên trong một lớp Dịch vụ đã được bắt đầu bằng một cuộc gọi bindService từ Hoạt động được hiển thị đầu tiên cho người dùng. Tôi đã hy vọng sử dụng một cuộc gọi runOnUiThread để hiển thị bánh mì nướng, nhưng tôi không thể tìm ra cách sử dụng nó trong Dịch vụ. – bursk

Trả lời

12

Vâng, bạn có thể sử dụng runOnUiThread, đó là cách hợp pháp.
Ngoài ra, bạn có thể thử phương án xử lý thay thế. Dù bằng cách nào nó cũng hoạt động.

Đây là một số mã từ đầu của tôi. Tôi không có SDK ngay bây giờ để kiểm tra nó nhưng tôi nghĩ rằng nó sẽ cung cấp cho bạn một ý tưởng chung.

public class ConnectionService extends Service { 
    private Handler handler = new Handler(); 

    public void restartConnection(){ 
    int sleepTime = reconnectCounter * MIN_RECON_WAIT; 
    if (sleepTime > MAX_RECON_WAIT) 
    { 
     sleepTime = MAX_RECON_WAIT; 
    } 
    String msg = "The connection has been lost. Restart attempt will start in: " + sleepTime/1000 + " seconds"; 
    (new Timer()).schedule(
    new TimerTask() { 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
       Toast.makeText(getApplicationContext(), "msg", Toast.LENGTH_LONG).show(); 
       reconnectCounter++; 
       this.startConnectionThread() 
       } 
      }); 
     } 
    }, sleepTime); 
    }//end restartConnection 

}//end ConnectionService 
+0

wow! Chỉ cần những gì tôi cần, cảm ơn bạn rất nhiều! – bursk

+1

đó không phải là giải pháp tốt. Tốt hơn và dễ dàng hơn: http://www.jjoe64.com/2011/09/show-toast-notification-from-service.html – appsthatmatter

+0

Cảm ơn bài đăng hữu ích! – Warwicky

Các vấn đề liên quan