Реализуйте Thread, предоставив новый класс, расширяющий Thread, и переопределив его метод run (). - PullRequest
1 голос
/ 21 июня 2011

Реализация Thread путем предоставления нового класса, расширяющего Thread, и переопределения его метода run () - новинка для меня.Я пытался весь день заставить его работать.Вот мой код:

/*
 * see http://developer.android.com/reference/java/lang/Thread.html
 */
class threadClass extends Thread {
    private Handler mHandler;
    private Message mMsg;
    // constructor
    public threadClass(Handler handler, Message msg) {
        // do something like save the Handler reference
        mHandler = handler;
        mMsg = msg;
    }
    @Override
    public void run() {
        // do some background processing, call the Handler?
        mHandler.sendMessage(mMsg);
    }
}
public Thread passHandlerToThread(Handler handler) {
    handler.sendEmptyMessage(10);
    Message msg = Message.obtain();
    msg.what = 10;
    Thread thread = new threadClass(handler, msg);
    return thread;
}
private Handler localHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        int what = msg.what;
        if (what == 10) Log.i("localHandler", "what: " + what);
    }
};
public void startThread() {
    Thread thread = passHandlerToThread(localHandler);
    thread.start();
}

Я вызываю startThread () в моем LocalService onCreate (), но ничего не происходит.Что я делаю неправильно?Я ожидал, что localHandler () будет вызван дважды: один раз в passHandlerToThread () и снова в run ().

1 Ответ

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

Сделайте что-то вроде этого:

private final Handler handler = new Handler();
// toast runnables
final Runnable updateTwitterNotification = new Runnable() {
    @Override
    public void run() {
        dismissProgressSpinner();
        Toast.makeText(getBaseContext(), "Tweet sent!", Toast.LENGTH_LONG).show();
    }
};  

final Runnable updateCreateError = new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getBaseContext(), "Tweet error!", Toast.LENGTH_LONG).show();
    }
};

postMessageInThread();


//implementation:
private void postMessageInThread() {
    Thread t = new Thread() {
        @Override
        public void run() {

            try {
                connectToTwitterService() // or whatever
                handler.post(updateTwitterNotification);
            } catch (Exception ex) {
                Log.e(TAG, "Error sending msg", ex);
                handler.post(updateCreateError);
            }
        }
    };
    t.start();
}
...