Потоки и сообщения Android

Я работаю над приложением для Android, которое использует фоновый рабочий поток. Мне нужно иметь возможность отправлять сообщения в поток из действия, но я не могу понять это.

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

Я пробовал следовать 10-12 хорошим учебникам, которые я нашел в Интернете, все из которых, казалось, имели разные способы делать что-то, но я все еще не заставил это работать правильно. Может ли кто-нибудь указать мне правильное направление?

Пример простого действия:

import android.os.Bundle;
import android.app.Activity;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savesInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    private void doWork() {
        Worker worker = new Worker();
        worker.start();

        worker.handler.sendEmptyMessage(0);
    }
}

Пример простой темы:

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;

public class Worker extends Thread {
    public Handler handler;

    public void run() {
        Looper.prepare();

        handler = new Handler() {
            public void handleMessage(Message msg) {
                Log.d("Worker.run()", "Got message saying " + msg.what);
            }
        };

        Looper.loop();
    }

person tfrederick74656    schedule 02.12.2012    source источник


Ответы (1)


Вы должны сначала прочитать, как использовать и что это за Looper, и не забудьте остановить Looper в конце Goodluck.

public class Worker extends Thread {
    public Handler handler;
@Override
public run() {
    Looper.prepare();
//initialization will take a little time you if you want to send message check if handler  != null
    handler = new Handler() {
        public void handleMessage(Message msg) {
            Log.d("Worker.run()", "Got message saying " + msg.what);
        }
    };

    Looper.loop();
}

public void sendMessage(Message m)
{ 
    while(handler == null);
    handler.sendMessages(m); 
}
person Mikhaili    schedule 02.12.2012
comment
Благодарю вас! Это решило одну из моих проблем, а другую (исключение NullPointerException, которое я продолжал получать при вызове нового обработчика) я решил, просто следуя этому вопросу stackoverflow.com/questions/2187464/ - person tfrederick74656; 03.12.2012