Как я могу создать класс, который действует как AsyncTask - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь создать класс, который делает то, что делает AsyncTask класс.

Я уже написал этот класс

public abstract class BackgroundProcess<Data, Result> {

    private Activity activity;

    public BackgroundProcess(Activity activity) {
        this.activity = activity;
    }

    @WorkerThread
    abstract Result runProcess(Data data);

    @MainThread
    abstract void onProcessFinished(Result result);

    public void execute(final Data data) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d("THREAD", "run");
                final Result result = runProcess(data);
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        onProcessFinished(result);
                    }
                });
            }
        }).start();
    }
}

И это работает, но проблема в том, что я должен предоставить ему Activity, чтобы иметь возможность запускать onProcessFinished() в главном потоке (AsyncTask не требует действия для работы)

Вот пример подкласса, который я использовал для его проверки.

public class ThreadTest extends BackgroundProcess<Void, List<User>> {

    private Context context;

    public ThreadTest(Context context) {
        super((Activity) context);
        this.context = context;
    }

    @Override
    List<User> runProcess(Void aVoid) {
        Log.d("THREAD", "runProcess");
        return UsersDatabase.Companion.getInstance(context).userDao().getAllUsers();
    }

    @Override
    void onProcessFinished(List<User> users) {
        Log.d("THREAD", users.size() + " finish");
        Toast.makeText(context, users.size() + "", Toast.LENGTH_SHORT).show();
    }

}

А фактическое использование в onCreate:

ThreadTest threadTest = new ThreadTest(this);
threadTest.execute(null);

Все работает нормально, но вопрос в том, как класс AsyncTask может выполнить onPostExecute() в главном потоке без активности?

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