Use Executor instead of AsyncTask in ParseMultiReddit.

This commit is contained in:
Docile-Alligator
2025-04-14 04:04:22 -04:00
parent 52f36d0871
commit cea57026b1
5 changed files with 70 additions and 115 deletions

View File

@ -133,8 +133,8 @@ public class CreateMultiRedditActivity extends BaseActivity {
if (!accountName.equals(Account.ANONYMOUS_ACCOUNT)) {
String jsonModel = new MultiRedditJSONModel(binding.multiRedditNameEditTextCreateMultiRedditActivity.getText().toString(), binding.descriptionEditTextCreateMultiRedditActivity.getText().toString(),
binding.visibilityChipCreateMultiRedditActivity.isChecked(), mSubreddits).createJSONModel();
CreateMultiReddit.createMultiReddit(mOauthRetrofit, mRedditDataRoomDatabase, accessToken,
"/user/" + accountName + "/m/" + binding.multiRedditNameEditTextCreateMultiRedditActivity.getText().toString(),
CreateMultiReddit.createMultiReddit(mExecutor, mHandler, mOauthRetrofit, mRedditDataRoomDatabase,
accessToken, "/user/" + accountName + "/m/" + binding.multiRedditNameEditTextCreateMultiRedditActivity.getText().toString(),
jsonModel, new CreateMultiReddit.CreateMultiRedditListener() {
@Override
public void success() {

View File

@ -436,22 +436,23 @@ public class SubscribedThingListingActivity extends BaseActivity implements Acti
private void loadMultiReddits() {
if (!accountName.equals(Account.ANONYMOUS_ACCOUNT)) {
FetchMyMultiReddits.fetchMyMultiReddits(mOauthRetrofit, accessToken, new FetchMyMultiReddits.FetchMyMultiRedditsListener() {
@Override
public void success(ArrayList<MultiReddit> multiReddits) {
InsertMultireddit.insertMultireddits(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddits, accountName, () -> {
mInsertMultiredditSuccess = true;
sectionsPagerAdapter.stopMultiRedditRefreshProgressbar();
});
}
FetchMyMultiReddits.fetchMyMultiReddits(mExecutor, mHandler, mOauthRetrofit, accessToken,
new FetchMyMultiReddits.FetchMyMultiRedditsListener() {
@Override
public void success(ArrayList<MultiReddit> multiReddits) {
InsertMultireddit.insertMultireddits(mExecutor, new Handler(), mRedditDataRoomDatabase, multiReddits, accountName, () -> {
mInsertMultiredditSuccess = true;
sectionsPagerAdapter.stopMultiRedditRefreshProgressbar();
});
}
@Override
public void failed() {
mInsertMultiredditSuccess = false;
sectionsPagerAdapter.stopMultiRedditRefreshProgressbar();
Toast.makeText(SubscribedThingListingActivity.this, R.string.error_loading_multi_reddit_list, Toast.LENGTH_SHORT).show();
}
});
@Override
public void failed() {
mInsertMultiredditSuccess = false;
sectionsPagerAdapter.stopMultiRedditRefreshProgressbar();
Toast.makeText(SubscribedThingListingActivity.this, R.string.error_loading_multi_reddit_list, Toast.LENGTH_SHORT).show();
}
});
}
}

View File

@ -25,7 +25,8 @@ public class CreateMultiReddit {
void failed(int errorType);
}
public static void createMultiReddit(Retrofit oauthRetrofit, RedditDataRoomDatabase redditDataRoomDatabase,
public static void createMultiReddit(Executor executor, Handler handler, Retrofit oauthRetrofit,
RedditDataRoomDatabase redditDataRoomDatabase,
String accessToken, String multipath, String model,
CreateMultiRedditListener createMultiRedditListener) {
Map<String, String> params = new HashMap<>();
@ -36,18 +37,18 @@ public class CreateMultiReddit {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
if (response.isSuccessful()) {
ParseMultiReddit.parseAndSaveMultiReddit(response.body(), redditDataRoomDatabase,
new ParseMultiReddit.ParseMultiRedditListener() {
@Override
public void success() {
createMultiRedditListener.success();
}
ParseMultiReddit.parseAndSaveMultiReddit(executor, handler, response.body(),
redditDataRoomDatabase, new ParseMultiReddit.ParseMultiRedditListener() {
@Override
public void success() {
createMultiRedditListener.success();
}
@Override
public void failed() {
createMultiRedditListener.failed(1);
}
});
@Override
public void failed() {
createMultiRedditListener.failed(1);
}
});
} else {
createMultiRedditListener.failed(response.code());
}

View File

@ -1,8 +1,11 @@
package ml.docilealligator.infinityforreddit.multireddit;
import android.os.Handler;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.concurrent.Executor;
import ml.docilealligator.infinityforreddit.apis.RedditAPI;
import ml.docilealligator.infinityforreddit.utils.APIUtils;
@ -17,13 +20,13 @@ public class FetchMyMultiReddits {
void failed();
}
public static void fetchMyMultiReddits(Retrofit oauthRetrofit, String accessToken, FetchMyMultiRedditsListener fetchMyMultiRedditsListener) {
public static void fetchMyMultiReddits(Executor executor, Handler handler, Retrofit oauthRetrofit, String accessToken, FetchMyMultiRedditsListener fetchMyMultiRedditsListener) {
oauthRetrofit.create(RedditAPI.class)
.getMyMultiReddits(APIUtils.getOAuthHeader(accessToken)).enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
if (response.isSuccessful()) {
ParseMultiReddit.parseMultiRedditsList(response.body(), new ParseMultiReddit.ParseMultiRedditsListListener() {
ParseMultiReddit.parseMultiRedditsList(executor, handler, response.body(), new ParseMultiReddit.ParseMultiRedditsListListener() {
@Override
public void success(ArrayList<MultiReddit> multiReddits) {
fetchMyMultiRedditsListener.success(multiReddits);

View File

@ -1,12 +1,13 @@
package ml.docilealligator.infinityforreddit.multireddit;
import android.os.AsyncTask;
import android.os.Handler;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.concurrent.Executor;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
import ml.docilealligator.infinityforreddit.utils.JSONUtils;
@ -22,13 +23,41 @@ public class ParseMultiReddit {
void failed();
}
public static void parseMultiRedditsList(String response, ParseMultiRedditsListListener parseMultiRedditsListListener) {
new ParseMultiRedditsListAsyncTask(response, parseMultiRedditsListListener).execute();
public static void parseMultiRedditsList(Executor executor, Handler handler, String response,
ParseMultiRedditsListListener parseMultiRedditsListListener) {
executor.execute(() -> {
try {
JSONArray arrayResponse = new JSONArray(response);
ArrayList<MultiReddit> multiReddits = new ArrayList<>();
for (int i = 0; i < arrayResponse.length(); i++) {
try {
multiReddits.add(parseMultiReddit(arrayResponse.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY)));
} catch (JSONException e) {
e.printStackTrace();
}
}
handler.post(() -> parseMultiRedditsListListener.success(multiReddits));
} catch (JSONException e) {
e.printStackTrace();
handler.post(parseMultiRedditsListListener::failed);
}
});
}
public static void parseAndSaveMultiReddit(String response, RedditDataRoomDatabase redditDataRoomDatabase,
public static void parseAndSaveMultiReddit(Executor executor, Handler handler, String response, RedditDataRoomDatabase redditDataRoomDatabase,
ParseMultiRedditListener parseMultiRedditListener) {
new ParseAndSaveMultiRedditAsyncTask(response, redditDataRoomDatabase, parseMultiRedditListener).execute();
executor.execute(() -> {
try {
MultiReddit multiReddit = parseMultiReddit(new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY));
redditDataRoomDatabase.multiRedditDao().insert(multiReddit);
handler.post(parseMultiRedditListener::success);
} catch (JSONException e) {
e.printStackTrace();
handler.post(parseMultiRedditListener::failed);
}
});
}
private static MultiReddit parseMultiReddit(JSONObject singleMultiRedditJSON) throws JSONException {
@ -56,83 +85,4 @@ public class ParseMultiReddit {
iconUrl, visibility, owner, nSubscribers, createdUTC, over18, isSubscriber,
isFavorited, subreddits);
}
private static class ParseMultiRedditsListAsyncTask extends AsyncTask<Void, Void, Void> {
private JSONArray arrayResponse;
private boolean parseFailed;
private ArrayList<MultiReddit> multiReddits;
private final ParseMultiRedditsListListener parseMultiRedditsListListener;
ParseMultiRedditsListAsyncTask(String response,
ParseMultiRedditsListListener parseMultiRedditsListListener) {
this.parseMultiRedditsListListener = parseMultiRedditsListListener;
try {
arrayResponse = new JSONArray(response);
multiReddits = new ArrayList<>();
parseFailed = false;
} catch (JSONException e) {
e.printStackTrace();
parseFailed = true;
}
}
@Override
protected Void doInBackground(Void... voids) {
if (!parseFailed) {
for (int i = 0; i < arrayResponse.length(); i++) {
try {
multiReddits.add(parseMultiReddit(arrayResponse.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY)));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (!parseFailed) {
parseMultiRedditsListListener.success(multiReddits);
} else {
parseMultiRedditsListListener.failed();
}
}
}
private static class ParseAndSaveMultiRedditAsyncTask extends AsyncTask<Void, Void, Void> {
private final String response;
private final RedditDataRoomDatabase redditDataRoomDatabase;
private MultiReddit multiReddit;
private final ParseMultiRedditListener parseMultiRedditListener;
ParseAndSaveMultiRedditAsyncTask(String response, RedditDataRoomDatabase redditDataRoomDatabase,
ParseMultiRedditListener parseMultiRedditListener) {
this.redditDataRoomDatabase = redditDataRoomDatabase;
this.parseMultiRedditListener = parseMultiRedditListener;
this.response = response;
}
@Override
protected Void doInBackground(Void... voids) {
try {
multiReddit = parseMultiReddit(new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY));
redditDataRoomDatabase.multiRedditDao().insert(multiReddit);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (multiReddit != null) {
parseMultiRedditListener.success();
} else {
parseMultiRedditListener.failed();
}
}
}
}