Подтвердить что ты не робот

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: "ваша форма была отправлена ​​" )

4b9b3361

Ответ 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()?