Use Executor instead of AsyncTask in FetchMultiRedditInfo.

This commit is contained in:
Docile-Alligator
2025-04-14 05:38:57 -04:00
parent cea57026b1
commit 28ccdb5a03
2 changed files with 56 additions and 68 deletions

View File

@ -115,22 +115,23 @@ public class EditMultiRedditActivity extends BaseActivity {
}
});
} else {
FetchMultiRedditInfo.fetchMultiRedditInfo(mRetrofit, accessToken, multipath, new FetchMultiRedditInfo.FetchMultiRedditInfoListener() {
@Override
public void success(MultiReddit multiReddit) {
EditMultiRedditActivity.this.multiReddit = multiReddit;
binding.progressBarEditMultiRedditActivity.setVisibility(View.GONE);
binding.linearLayoutEditMultiRedditActivity.setVisibility(View.VISIBLE);
binding.multiRedditNameEditTextEditMultiRedditActivity.setText(multiReddit.getDisplayName());
binding.descriptionEditTextEditMultiRedditActivity.setText(multiReddit.getDescription());
binding.visibilitySwitchEditMultiRedditActivity.setChecked(!multiReddit.getVisibility().equals("public"));
}
FetchMultiRedditInfo.fetchMultiRedditInfo(mExecutor, mHandler, mRetrofit, accessToken,
multipath, new FetchMultiRedditInfo.FetchMultiRedditInfoListener() {
@Override
public void success(MultiReddit multiReddit) {
EditMultiRedditActivity.this.multiReddit = multiReddit;
binding.progressBarEditMultiRedditActivity.setVisibility(View.GONE);
binding.linearLayoutEditMultiRedditActivity.setVisibility(View.VISIBLE);
binding.multiRedditNameEditTextEditMultiRedditActivity.setText(multiReddit.getDisplayName());
binding.descriptionEditTextEditMultiRedditActivity.setText(multiReddit.getDescription());
binding.visibilitySwitchEditMultiRedditActivity.setChecked(!multiReddit.getVisibility().equals("public"));
}
@Override
public void failed() {
Snackbar.make(binding.coordinatorLayoutEditMultiRedditActivity, R.string.cannot_fetch_multireddit, Snackbar.LENGTH_SHORT).show();
}
});
@Override
public void failed() {
Snackbar.make(binding.coordinatorLayoutEditMultiRedditActivity, R.string.cannot_fetch_multireddit, Snackbar.LENGTH_SHORT).show();
}
});
}
} else {
binding.progressBarEditMultiRedditActivity.setVisibility(View.GONE);

View File

@ -1,9 +1,10 @@
package ml.docilealligator.infinityforreddit.multireddit;
import android.os.AsyncTask;
import android.os.Handler;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import org.json.JSONArray;
import org.json.JSONException;
@ -29,13 +30,21 @@ public class FetchMultiRedditInfo {
void failed();
}
public static void fetchMultiRedditInfo(Retrofit retrofit, String accessToken, String multipath,
public static void fetchMultiRedditInfo(Executor executor, Handler handler, Retrofit retrofit,
String accessToken, String multipath,
FetchMultiRedditInfoListener fetchMultiRedditInfoListener) {
retrofit.create(RedditAPI.class).getMultiRedditInfo(APIUtils.getOAuthHeader(accessToken), multipath).enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
if (response.isSuccessful()) {
new ParseMultiRedditInfoAsyncTask(response.body(), fetchMultiRedditInfoListener).execute();
executor.execute(() -> {
MultiReddit multiReddit = parseMultiRedditInfo(response.body());
if (multiReddit != null) {
handler.post(() -> fetchMultiRedditInfoListener.success(multiReddit));
} else {
handler.post(fetchMultiRedditInfoListener::failed);
}
});
} else {
fetchMultiRedditInfoListener.failed();
}
@ -65,58 +74,36 @@ public class FetchMultiRedditInfo {
});
}
private static class ParseMultiRedditInfoAsyncTask extends AsyncTask<Void, Void, Void> {
private final String response;
private final FetchMultiRedditInfoListener fetchMultiRedditInfoListener;
private MultiReddit multiReddit;
private boolean parseFailed = false;
public ParseMultiRedditInfoAsyncTask(String response, FetchMultiRedditInfoListener fetchMultiRedditInfoListener) {
this.response = response;
this.fetchMultiRedditInfoListener = fetchMultiRedditInfoListener;
}
@Override
protected Void doInBackground(Void... voids) {
try {
JSONObject object = new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY);
String path = object.getString(JSONUtils.PATH_KEY);
String displayName = object.getString(JSONUtils.DISPLAY_NAME_KEY);
String name = object.getString(JSONUtils.NAME_KEY);
String description = object.getString(JSONUtils.DESCRIPTION_MD_KEY);
String copiedFrom = object.getString(JSONUtils.COPIED_FROM_KEY);
String iconUrl = object.getString(JSONUtils.ICON_URL_KEY);
String visibility = object.getString(JSONUtils.VISIBILITY_KEY);
String owner = object.getString(JSONUtils.OWNER_KEY);
int nSubscribers = object.getInt(JSONUtils.NUM_SUBSCRIBERS_KEY);
long createdUTC = object.getLong(JSONUtils.CREATED_UTC_KEY);
boolean over18 = object.getBoolean(JSONUtils.OVER_18_KEY);
boolean isSubscriber = object.getBoolean(JSONUtils.IS_SUBSCRIBER_KEY);
boolean isFavorite = object.getBoolean(JSONUtils.IS_FAVORITED_KEY);
ArrayList<String> subreddits = new ArrayList<>();
JSONArray subredditsArray = object.getJSONArray(JSONUtils.SUBREDDITS_KEY);
for (int i = 0; i < subredditsArray.length(); i++) {
subreddits.add(subredditsArray.getJSONObject(i).getString(JSONUtils.NAME_KEY));
}
multiReddit = new MultiReddit(path, displayName, name, description, copiedFrom, iconUrl,
visibility, owner, nSubscribers, createdUTC, over18, isSubscriber, isFavorite,
subreddits);
} catch (JSONException e) {
parseFailed = true;
@WorkerThread
@Nullable
private static MultiReddit parseMultiRedditInfo(String response) {
try {
JSONObject object = new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY);
String path = object.getString(JSONUtils.PATH_KEY);
String displayName = object.getString(JSONUtils.DISPLAY_NAME_KEY);
String name = object.getString(JSONUtils.NAME_KEY);
String description = object.getString(JSONUtils.DESCRIPTION_MD_KEY);
String copiedFrom = object.getString(JSONUtils.COPIED_FROM_KEY);
String iconUrl = object.getString(JSONUtils.ICON_URL_KEY);
String visibility = object.getString(JSONUtils.VISIBILITY_KEY);
String owner = object.getString(JSONUtils.OWNER_KEY);
int nSubscribers = object.getInt(JSONUtils.NUM_SUBSCRIBERS_KEY);
long createdUTC = object.getLong(JSONUtils.CREATED_UTC_KEY);
boolean over18 = object.getBoolean(JSONUtils.OVER_18_KEY);
boolean isSubscriber = object.getBoolean(JSONUtils.IS_SUBSCRIBER_KEY);
boolean isFavorite = object.getBoolean(JSONUtils.IS_FAVORITED_KEY);
ArrayList<String> subreddits = new ArrayList<>();
JSONArray subredditsArray = object.getJSONArray(JSONUtils.SUBREDDITS_KEY);
for (int i = 0; i < subredditsArray.length(); i++) {
subreddits.add(subredditsArray.getJSONObject(i).getString(JSONUtils.NAME_KEY));
}
return new MultiReddit(path, displayName, name, description, copiedFrom, iconUrl,
visibility, owner, nSubscribers, createdUTC, over18, isSubscriber, isFavorite,
subreddits);
} catch (JSONException e) {
e.printStackTrace();
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (parseFailed) {
fetchMultiRedditInfoListener.failed();
} else {
fetchMultiRedditInfoListener.success(multiReddit);
}
}
}
}