Android - вызов ui потока из рабочего потока
Привет, я хочу сделать Toast
доступным для меня no-matter-what и доступным из любого потока всякий раз, когда мне нравится в моем приложении. Поэтому для этого я расширил класс Activity
:
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;
public class MyActivity extends Activity{
private Handler mHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
mHandler = new Handler();
super.onCreate(savedInstanceState);
}
private class ToastRunnable implements Runnable {
String mText;
public ToastRunnable(String text) {
mText = text;
}
public void run(){
Toast.makeText(getApplicationContext(), mText, Toast.LENGTH_SHORT).show();
}
}
public void doToast(String msg) {
mHandler.post(new ToastRunnable(msg));
}
}
чтобы все Activity
классы в моем приложении теперь просто
public class AppMain extends MyActivity {
//blah
}
то, что я ожидал сделать (в рабочем потоке), было следующим:
try{
MyActivity me = (MyActivity) Looper.getMainLooper().getThread();
me.doToast("Hello World");
}
catch (Exception ex){
Log.e("oh dear", ex.getMessage());
}
и пока Activity
был "MyActivity
", он должен работать, но проблема в том, что --- > Looper.getMainLooper().getThread();
не возвращает мне MyActivity
, и это заставляет меня плакать - Что я делаю не так?
: EDIT:
некоторый фон, чтобы объяснить "почему" я застрял с этим типом внедрения.
Мне нужно иметь возможность подтвердить пользователю, что событие "HTTP POST" прошло успешно. Теперь. Если пользователь нажимает "ОК" в форме пользовательского интерфейса, он МОЖЕТ или НЕ МОЖЕТ БЫТЬ интернет в то время. Если у него есть Интернет - все хорошо и хорошо - он отправляет форму через HTTP POST все хорошо и хорошо.. но если есть НЕТ интернет, то большинство (99.999% приложений Android lame/pathetic/mewling при этом и в основном предлагают пользователю план "b" , предполагая, что во все времена интернет есть - когда это НЕ)
Мое приложение не будет "хромым (как я его называю)" - у него действительно есть план "b" , вместо этого он "Очереди" события сообщения и повторяет каждые x минут.. теперь это это бесшумная нить в фоновом режиме. У меня много взаимодействия с пользователем во всем приложении. Я не знаю, где пользователь будет "быть", но в конце концов, когда HTTP POST, что очередь/повторяет/очереди/повторы возвращается "! Успех!" Я хочу, чтобы Toast
это как сообщение пользователю (EG: "ваша форма была отправлена " )
Ответы
Ответ 1
Что случилось с runOnUiThread
?
http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)
activity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(activity, "Hello, world!", Toast.LENGTH_SHORT).show();
}
});
Ответ 2
используйте ниже код. создайте объект активности, содержащий ваш экземпляр активности.
activity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(activity.getApplicationContext(),"Toast text",Toast.LENGTH_SHORT).show();
}
);
Ответ 3
Это позволит вам отображать сообщение без необходимости полагаться на контекст для запуска тоста, только для ссылки при отображении самого сообщения.
runOnUiThread не работал из потока OpenGL View, и это было решением. Надеюсь, что это поможет.
private Handler handler = new Handler();
handler.post(new Runnable() {
public void run() {
Toast.makeText(activity, "Hello, world!", Toast.LENGTH_SHORT).show();
}
});
Ответ 4
Вы не можете просто передать результат getThread()
в экземпляр вашего базового класса MyActivity
. getThread()
возвращает a Thread
, который не имеет ничего общего с Activity
.
Там нет отличного чтения: чистый способ делать то, что вы хотите сделать. В какой-то момент абстракция вашего рабочего потока должна иметь ссылку на то, что может создать Toast
для вас. Сохранение некоторой статической переменной, содержащей ссылку на ваш подкласс Activity
, просто для создания ярлыка Toast
Создание - это рецепт утечек памяти и боли.
Ответ 5
Почему бы вам не отправить намерение, которое было захвачено BroadCastReceiver, тогда широковещательный приемник может создать уведомление в лотке уведомлений. Это не тост, но его способ информировать пользователя о том, что его сообщение прошло успешно.
Ответ 6
если у вас есть контекст с вами, вы можете вызывать поток ui, как это из класса неактивности.
((Activity)context).runOnUiThread(new Runnable() {
public void run() {
// things need to work on ui thread
}
});
Ответ 7
Если это происходит в вашей собственной деятельности, почему вы не можете просто вызвать doToast()
?