«Самодельный» AsyncTask

Спасибо, что читаете это.

Ни для кого не секрет, что AsyncTask устарел. Этот факт разочаровал и воодушевил меня одновременно: с одной стороны, он был для меня единственным решением многих задач, с другой стороны, нужно было сделать что-нибудь подобное, используя неустаревающие потоки.

Я сделал то, что неплохо работает для меня. Так как я не смог найти простые ответы на свои вопросы, приведу код моего творения, для того чтобы вы помогли мне выявить если не все, то хотя бы многие недочёты в реализации.

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

import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;

public class BackgroundTask {

    private final Handler ui = new Handler(Looper.getMainLooper());

    public void execute() {
        final HandlerThread thread = new HandlerThread("AsyncTask");
        thread.start();
        final Handler handler = new Handler(thread.getLooper());
        final Runnable pre = new Runnable() {
            @Override
            public void run() {
                onStart();
            };
        };
        final Runnable post = new Runnable() {
            @Override
            public void run() {
                onFinish();
                thread.interrupt();
                handler.removeCallbacksAndMessages(null);
                ui.removeCallbacksAndMessages(null);
            };
        };
        final Runnable run = new Runnable() {
            @Override
            public void run() {
                ui.post(pre);
                doInBackground();
                ui.post(post);
            };
        };
        handler.post(run);
    };

    public void publish() {
        ui.post(new Runnable() {
            @Override
            public void run() {
                onPublishProgress();
            };
        });
    };

    protected void onStart() {
    };

    protected void doInBackground() {
    };

    protected void onFinish() {
    };

    protected void onPublishProgress() {
    };
}

Спасибо.

P.S. я всегда буду считать себя новичком в программировании под Android, потому что невозможно всеобъемлюще его знать (отсюда-то и такие глупые вопросы).

P.P.S. буду рад увидеть комментарии об оформлении. Думается мне, что это может выглядеть лучше.


Ответы (1 шт):

Автор решения: Barmaley Red Star

А кто сказал, что AsyncTask устарел? Далее собственно замечания к коду:

  1. AsyncTask для выполнения задачи умеет его самостоятельно разбивать на несколько потоков, а ваш держит все в одном потоке.
  2. Есть проблема с потоками pre/run/post нет гарантии, что например run будет выполнен строго после pre, а post будет выполнен строго после run - в итоге будет каша
  3. BackgroundTask надо декларировать как abstract или interface иначе его практическая ценность непонятна - ну то есть непонятно как его использовать.
  4. Вы зря останавливаете HandlerThread через interrupt() (мало того, что при это не ловите эксепшн) - православный способ через quit()

Вообще надо смотреть как эта конструкция будет работать в реале, трудно вот так сразу с ходу говорить. Нужно отладчиком пройтись - вы это сами то делали?

→ Ссылка