Làm cách nào để hiển thị Toast thư từ một chuỗi?Android: Bánh mì nướng trong một chủ đề
Trả lời
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();
}
});
rất hữu ích thx – Joel
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
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
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();
}
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));
Cảm ơn, tôi đang thêm hoạt động này nhiều nhất hiện nay. –
Đố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! –
@YoushaAleayoub tại sao? – OneWorld
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.
Đ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();
}
});
}
}
- Nhận dụ UI Chủ đề Handler và sử dụng
handler.sendMessage();
- Gọi
post()
phương pháphandler.post();
runOnUiThread()
view.post()
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 Service
và Application
.
Đô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 đó.
- Bạn có UI Chủ đề
- 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ênHandlerThread
- 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áoToast
.
Giải pháp:
- Tạo một HandlerThread và bắt đầu nó
- Tạo một Handler với Looper từ
HandlerThread
:requestHandler
- Tạo một Handler với Looper từ chủ đề chính:
responseHandler
và ghi đèhandleMessage
phương pháp post
một nhiệm vụRunnable
vàorequestHandler
- Bên
Runnable
nhiệm vụ, hãy gọisendMessage
trênresponseHandler
- này gọi
sendMessage
kết quả củahandleMessage
trongresponseHandler
. - 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
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.
[Điều này] (http://stackoverflow.com/a/16886486/1919641) trả lời chi tiết câu hỏi. – mjosh
câu trả lời này cung cấp giải pháp ngắn nhất: http://stackoverflow.com/a/18280318/1891118 –