2010-11-17 21 views
11

Ứng dụng của tôi sẽ khởi chạy một chuỗi để truy vấn web cho một số dữ liệu. Tôi muốn hiển thị thông báo Toast khi không tìm thấy gì, nhưng ứng dụng của tôi luôn bị treo.Đăng tin nhắn chúc mừng từ Chủ đề

Tôi đã cố gắng sử dụng bối cảnh ứng dụng từ bên trong các chủ đề, như vậy:

Toast.makeText(getApplicationContext(), "testttt", Toast.LENGTH_LONG).show(); 

Tôi đã cũng đã cố gắng tạo ra một Runnable với các cuộc gọi Toast và gọi runOnUiThread (Runnable) từ Thread (các Gọi bánh mì nướng trong runnable này sử dụng các hoạt động như tham số đầu tiên).

Có ai có bất kỳ ý tưởng nào về cách thực hiện việc này không?

+0

Bạn đang sử dụng 'Thread' như một lớp bên trong hoặc bạn đang mở rộng 'AsyncTask' trong một lớp hoàn toàn riêng biệt? –

+0

Hiện tại tôi đang sử dụng một lớp mà tôi đã mở rộng từ Chủ đề. Có khả năng tôi sẽ chuyển nó vào AsyncTask tại một thời điểm nào đó. Tôi đã không nhận được xung quanh để nó được nêu ra. – Andrew

Trả lời

22

Cố gắng gửi bên trong để một đối tượng Handler.

final Handler mHandler = new Handler(); 
final Runnable mUpdateResults = new Runnable() { 
    public void run() { 
     Toast(this, message, duration).show(); 
    } 

new Thread() { 
    public void run() { 
     mHandler.post(mUpdateResults); 
    } 
}.start(); 
3

Hãy thử triển khai một lớp mở rộng "Trình xử lý" trong lớp Hoạt động của bạn và gửi Thư cho nó từ chuỗi khác. Giải thích chi tiết hơn ở đây:

http://www.anddev.org/the_pizza_timer_-_threading-drawing_on_canvas-t126.html

Và xin vui lòng, khi hỏi một câu hỏi như thế này, bao gồm các stack trace bạn đang nhận được.

+0

Lưu ý; và cảm ơn, tôi sẽ thử. – Andrew

4

Toast.makeText().show() chắc chắn cần phải chạy trên chuỗi giao diện người dùng.

Bạn có lẽ nên sử dụng một AsyncTask như Octavian Damiean đề cập, nhưng đây là một số mã sử dụng runOnUiThread nếu bạn đang thiết lập về việc sử dụng rằng:

public void showToastFromBackground(final String message) { 
    runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      Toast.makeText(this, message, Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 
+0

Như tôi đã nêu trong bài đăng gốc của mình, tôi đã thử cách này và nó bị treo – Andrew

+2

Đăng theo dõi ngăn xếp trong bài đăng gốc của bạn. –

+0

trong mã ở trên tham số đầu tiên "this" có thể không chính xác, bạn cần phải chuyển một ngữ cảnh hợp lệ một cách rõ ràng, f.i. ProgressDialog.getContent() của bạn –

1

Nếu bạn đang chạy Handler từ lớp Hoạt động của bạn, bạn có thể thiết lập bối cảnh bằng cách chỉ cần tham khảo .Đây của hoạt động của bạn như sau:

final Runnable showToastMessage = new Runnable() { 
    public void run() { 
     Toast.makeText(YourActivity.this, "Message", Toast.LENGTH_SHORT).show(); 
    } 
}; 
Các vấn đề liên quan