Я пытаюсь создать класс, который делает то, что делает 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()
в главном потоке без активности?