2010-06-28 40 views

Trả lời

211

Bạn có thể làm điều đó bằng cách gọi một runOnUiThread phương pháp Activity 's từ chủ đề của bạn:

activity.runOnUiThread(new Runnable() { 
    public void run() { 
     Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show(); 
    } 
}); 
+0

rất hữu ích thx – Joel

+0

Tôi không chắc mình hiểu cách thực hiện điều này. Tôi đã có khoảng trống công khai hiện tại của tôi(). Tôi đã thử đặt mã này ở đó. Tôi biết điều đó không đúng vì nó không hoạt động, nhưng tôi thực sự bị mắc kẹt. – SwimBikeRun

+12

Có phải "hoạt động" được chuyển tới luồng không phải là ui trong hàm khởi tạo của nó không? Cách đúng để lấy đối tượng hoạt động mà bạn đang sử dụng từ bên trong chuỗi riêng biệt là gì? – snapfractalpop

8

Giống như this hoặc this, với Runnable hiển thị số Toast. Cụ thể,

Activity activity = // reference to an Activity 
// or 
View view = // reference to a View 

activity.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     showToast(activity); 
    } 
}); 
// or 
view.post(new Runnable() { 
    @Override 
    public void run() { 
     showToast(view.getContext()); 
    } 
}); 

private void showToast(Context ctx) { 
    Toast.makeText(ctx, "Hi!", Toast.LENGTH_SHORT).show(); 
} 
52

Tôi muốn có một phương pháp trong hoạt động của tôi gọi showToast mà tôi có thể gọi từ bất cứ nơi nào ...

public void showToast(final String toast) 
{ 
    runOnUiThread(new Runnable() { 
     public void run() 
     { 
      Toast.makeText(MyActivity.this, toast, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

Sau đó tôi thường gọi nó từ bên trong MyActivity trên bất kỳ chủ đề nào như thế này ...

showToast(getString(R.string.MyMessage)); 
+3

Cảm ơn, tôi đang thêm hoạt động này nhiều nhất hiện nay. –

+0

Đối với TOAST, luôn sử dụng Ngữ cảnh ứng dụng chứ không phải ngữ cảnh hoạt động! –

+0

@YoushaAleayoub tại sao? – OneWorld

2

Bạn có thể sử dụng Looper để gửi tin nhắn Toast. Đi qua số này link để biết thêm chi tiết.

public void showToastInThread(final Context context,final String str){ 
    Looper.prepare(); 
    MessageQueue queue = Looper.myQueue(); 
    queue.addIdleHandler(new IdleHandler() { 
     int mReqCount = 0; 

     @Override 
     public boolean queueIdle() { 
      if (++mReqCount == 2) { 
        Looper.myLooper().quit(); 
        return false; 
      } else 
        return true; 
     } 
    }); 
    Toast.makeText(context, str,Toast.LENGTH_LONG).show();  
    Looper.loop(); 
} 

và nó được gọi trong chủ đề của bạn. Bối cảnh có thể là Activity.getContext() nhận được từ Activity bạn phải hiển thị bánh mì nướng.

20

Điều này tương tự như các câu trả lời khác, tuy nhiên được cập nhật cho apis mới có sẵn và sạch hơn nhiều. Ngoài ra, không cho rằng bạn đang ở trong một bối cảnh hoạt động.

public class MyService extends AnyContextSubclass { 

    public void postToastMessage(final String message) { 
     Handler handler = new Handler(Looper.getMainLooper()); 

     handler.post(new Runnable() { 

      @Override 
      public void run() { 
       Toast.makeText(getContext(), message, Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } 
} 
3
  1. Nhận dụ UI Chủ đề Handler và sử dụng handler.sendMessage();
  2. Gọi post() phương pháp handler.post();
  3. runOnUiThread()
  4. view.post()
5

Một cách tiếp cận mà làm việc từ bất cứ đâu, kể cả từ những nơi nơi bạn don 'T có một Activity hoặc View, là để lấy một Handler đến các chủ đề chính và hiển thị các bánh mì nướng:

public void toast(final Context context, final String text) { 
    Handler handler = new Handler(Looper.getMainLooper()); 
    handler.post(new Runnable() { 
    public void run() { 
     Toast.makeText(context, text, Toast.DURATION_LONG).show(); 
    } 
    }) 
} 

Ưu điểm của phương pháp này là nó hoạt động với bất kỳ Context, bao gồm ServiceApplication.

4

Đôi khi, bạn phải gửi thư từ một số khác Thread đến chuỗi giao diện người dùng. Loại kịch bản này xảy ra khi bạn không thể thực thi các hoạt động Mạng/IO trên luồng giao diện người dùng.

Dưới đây ví dụ xử lý trường hợp đó.

  1. Bạn có UI Chủ đề
  2. Bạn phải bắt đầu hoạt động IO và vì thế bạn không thể chạy Runnable trên thread UI.Vì vậy, hãy đăng số Runnable của bạn để xử lý trên HandlerThread
  3. Lấy kết quả từ Runnable và gửi lại cho chuỗi giao diện người dùng và hiển thị thông báo Toast.

Giải pháp:

  1. Tạo một HandlerThread và bắt đầu nó
  2. Tạo một Handler với Looper từ HandlerThread: requestHandler
  3. Tạo một Handler với Looper từ chủ đề chính: responseHandler và ghi đè handleMessage phương pháp
  4. post một nhiệm vụ Runnable vào requestHandler
  5. Bên Runnable nhiệm vụ, hãy gọi sendMessage trên responseHandler
  6. này gọi sendMessage kết quả của handleMessage trong responseHandler.
  7. Nhận thuộc tính từ Message và xử lý nó, cập nhật giao diện người dùng

Mẫu mã:

/* Handler thread */ 

    HandlerThread handlerThread = new HandlerThread("HandlerThread"); 
    handlerThread.start(); 
    Handler requestHandler = new Handler(handlerThread.getLooper()); 

    final Handler responseHandler = new Handler(Looper.getMainLooper()) { 
     @Override 
     public void handleMessage(Message msg) { 
      //txtView.setText((String) msg.obj); 
      Toast.makeText(MainActivity.this, 
        "Runnable on HandlerThread is completed and got result:"+(String)msg.obj, 
        Toast.LENGTH_LONG) 
        .show(); 
     } 
    }; 

    for (int i=0; i<5; i++) { 
     Runnable myRunnable = new Runnable() { 
      @Override 
      public void run() { 
       try { 

        /* Add your business logic here and construct the 
         Messgae which should be handled in UI thread. For 
         example sake, just sending a simple Text here*/ 

        String text = "" + (++rId); 
        Message msg = new Message(); 

        msg.obj = text.toString(); 
        responseHandler.sendMessage(msg); 
        System.out.println(text.toString()); 

       } catch (Exception err) { 
        err.printStackTrace(); 
       } 
      } 
     }; 
     requestHandler.post(myRunnable); 
    } 

bài viết hữu ích:

handlerthreads-and-why-you-should-be-using-them-in-your-android-apps

android-looper-handler-handlerthread-i

0

tôi ma theo phương pháp này dựa trên câu trả lời của mjaggard:

public static void toastAnywhere(final String text) { 
    Handler handler = new Handler(Looper.getMainLooper()); 
    handler.post(new Runnable() { 
     public void run() { 
      Toast.makeText(SuperApplication.getInstance().getApplicationContext(), text, 
        Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

Làm việc tốt cho tôi.

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