Доступ к компоненту пользовательского интерфейса в Activity из потока класса Service в Android - PullRequest
0 голосов
/ 13 июня 2011

У меня есть класс, названный MyService, который расширяет Service ниже. Все будет работать до Я удаляю строку Toast.makeText... в методе выполнения Thread.

Почему? И как я могу получить доступ к компонентам Activity из метода run класса Thread?

public class MyService extends Service {

@Override
public IBinder onBind(Intent intent) { return null; }

@Override
public void onCreate() {
    Toast.makeText(this, "This msg will be shown", Toast.LENGTH_LONG).show();
    Log.d("Bilgi", "This msg will be shown.");
    super.onCreate();
}

@Override
public void onStart(Intent intent, int startId) {
    Toast.makeText(this, "This msg will be shown", Toast.LENGTH_LONG).show();
    super.onStart(intent, startId);

    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            try {
                Log.d("This msg will ","be shown"); //if I remove next line 
                Toast.makeText(this, "This msg will NOT be shown", Toast.LENGTH_LONG).show(); 

                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }, 5000, 8000);
}

Ответы [ 5 ]

1 голос
/ 13 июня 2011

А как я могу получить доступ к компонентам Activity из метода run класса Thread?

Вы не делаете. Используйте Messenger для отправки Message объектов из службы в Handler действия. Действие - и только действие - может обновлять свои виджеты, и только из основного потока приложения.

Вот пример приложения , демонстрирующий это.

1 голос
/ 13 июня 2011

Не использовать потоки - использовать AyncTasks .Кроме того, вы не должны получать доступ к методам / пользовательскому интерфейсу Activity через потоки / задачи.Взгляните на первую ссылку, чтобы понять, как Activity и ее «потоки» работают вместе.

0 голосов
/ 25 июня 2014

Виджеты пользовательского интерфейса не являются поточно-ориентированными , поэтому вы не можете обновить виджет пользовательского интерфейса, кроме случаев, когда в основном потоке (UI) в вашем случае создание Toast в другом потоке, который запрещен.

Возможно, вам потребуется использовать что-то вроде Handler и использовать Messenger для отправки сообщения обработчику, созданному в потоке пользовательского интерфейса.А затем разберитесь с виджетами в методе handleMessage(Message msg).

0 голосов
/ 13 июня 2011

При создании тоста передайте ApplicationContext, который вы можете получить через getApplicationContext ()

0 голосов
/ 13 июня 2011

Единственный известный мне метод - это использовать приемник вещания внутри вашей активности, который будет перехватывать вам сообщения и обновлять пользовательский интерфейс или все, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...