From c2ff41be220af81cd668c3f27f9eed03e4dbfc40 Mon Sep 17 00:00:00 2001 From: Docile-Alligator <25734209+Docile-Alligator@users.noreply.github.com> Date: Sun, 13 Apr 2025 11:29:18 -0400 Subject: [PATCH] Use Executor instead of AsyncTask in FetchUserFlairs. --- .../activities/SelectUserFlairActivity.java | 2 +- .../UserFlairRecyclerViewAdapter.java | 3 +- .../user/FetchUserFlairs.java | 101 ++++++------------ 3 files changed, 38 insertions(+), 68 deletions(-) diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SelectUserFlairActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SelectUserFlairActivity.java index b924ea15..bc77fb35 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SelectUserFlairActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SelectUserFlairActivity.java @@ -95,7 +95,7 @@ public class SelectUserFlairActivity extends BaseActivity implements ActivityToo private void bindView() { if (mUserFlairs == null) { - FetchUserFlairs.fetchUserFlairsInSubreddit(mOauthRetrofit, accessToken, mSubredditName, + FetchUserFlairs.fetchUserFlairsInSubreddit(mExecutor, mHandler, mOauthRetrofit, accessToken, mSubredditName, new FetchUserFlairs.FetchUserFlairsInSubredditListener() { @Override public void fetchSuccessful(ArrayList userFlairs) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/UserFlairRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/UserFlairRecyclerViewAdapter.java index edf24c89..9888cdbe 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/UserFlairRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/UserFlairRecyclerViewAdapter.java @@ -22,7 +22,8 @@ public class UserFlairRecyclerViewAdapter extends RecyclerView.Adapter userFlairs; private final ItemClickListener itemClickListener; - public UserFlairRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper, ArrayList userFlairs, + public UserFlairRecyclerViewAdapter(BaseActivity activity, CustomThemeWrapper customThemeWrapper, + ArrayList userFlairs, ItemClickListener itemClickListener) { this.activity = activity; this.customThemeWrapper = customThemeWrapper; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/user/FetchUserFlairs.java b/app/src/main/java/ml/docilealligator/infinityforreddit/user/FetchUserFlairs.java index d1bf7242..69bc74e2 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/user/FetchUserFlairs.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/user/FetchUserFlairs.java @@ -1,80 +1,56 @@ package ml.docilealligator.infinityforreddit.user; -import android.os.AsyncTask; +import android.os.Handler; import android.text.Html; -import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.io.IOException; import java.util.ArrayList; +import java.util.concurrent.Executor; import ml.docilealligator.infinityforreddit.apis.RedditAPI; import ml.docilealligator.infinityforreddit.utils.APIUtils; import ml.docilealligator.infinityforreddit.utils.JSONUtils; -import retrofit2.Call; -import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; public class FetchUserFlairs { - public static void fetchUserFlairsInSubreddit(Retrofit oauthRetrofit, String accessToken, String subredditName, FetchUserFlairsInSubredditListener fetchUserFlairsInSubredditListener) { - RedditAPI api = oauthRetrofit.create(RedditAPI.class); + public static void fetchUserFlairsInSubreddit(Executor executor, Handler handler, Retrofit oauthRetrofit, String accessToken, String subredditName, FetchUserFlairsInSubredditListener fetchUserFlairsInSubredditListener) { + executor.execute(() -> { + RedditAPI api = oauthRetrofit.create(RedditAPI.class); - Call flairsCall = api.getUserFlairs(APIUtils.getOAuthHeader(accessToken), subredditName); - flairsCall.enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { + try { + Response response = api.getUserFlairs(APIUtils.getOAuthHeader(accessToken), subredditName).execute(); if (response.isSuccessful()) { - new ParseUserFlairsAsyncTask(response.body(), new ParseUserFlairsAsyncTask.ParseUserFlairsAsyncTaskListener() { - @Override - public void parseSuccessful(ArrayList userFlairs) { - fetchUserFlairsInSubredditListener.fetchSuccessful(userFlairs); - } - - @Override - public void parseFailed() { - fetchUserFlairsInSubredditListener.fetchFailed(); - } - }).execute(); + ArrayList userFlairs = parseUserFlairs(response.body()); + if (userFlairs == null) { + handler.post(fetchUserFlairsInSubredditListener::fetchFailed); + } else { + handler.post(() -> fetchUserFlairsInSubredditListener.fetchSuccessful(userFlairs)); + } } else if (response.code() == 403) { //No flairs - fetchUserFlairsInSubredditListener.fetchSuccessful(null); + handler.post(() -> fetchUserFlairsInSubredditListener.fetchSuccessful(null)); } else { - fetchUserFlairsInSubredditListener.fetchFailed(); + handler.post(fetchUserFlairsInSubredditListener::fetchFailed); } - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - fetchUserFlairsInSubredditListener.fetchFailed(); + } catch (IOException e) { + handler.post(fetchUserFlairsInSubredditListener::fetchFailed); } }); } - public interface FetchUserFlairsInSubredditListener { - void fetchSuccessful(ArrayList userFlairs); - - void fetchFailed(); - } - - private static class ParseUserFlairsAsyncTask extends AsyncTask, ArrayList> { - private final String response; - private final ParseUserFlairsAsyncTaskListener parseFlairsAsyncTaskListener; - - ParseUserFlairsAsyncTask(String response, ParseUserFlairsAsyncTaskListener parseFlairsAsyncTaskListener) { - this.response = response; - this.parseFlairsAsyncTaskListener = parseFlairsAsyncTaskListener; - } - - @Override - protected ArrayList doInBackground(Void... voids) { - try { - JSONArray jsonArray = new JSONArray(response); - ArrayList userFlairs = new ArrayList<>(); - for (int i = 0; i < jsonArray.length(); i++) { + private static ArrayList parseUserFlairs(String response) { + try { + JSONArray jsonArray = new JSONArray(response); + ArrayList userFlairs = new ArrayList<>(); + for (int i = 0; i < jsonArray.length(); i++) { + try { JSONObject userFlairObject = jsonArray.getJSONObject(i); String id = userFlairObject.getString(JSONUtils.ID_KEY); String text = userFlairObject.getString(JSONUtils.TEXT_KEY); @@ -96,27 +72,20 @@ public class FetchUserFlairs { } userFlairs.add(new UserFlair(id, text, authorFlairHTMLBuilder.toString(), editable, maxEmojis)); + } catch (JSONException e) { + e.printStackTrace(); } - return userFlairs; - } catch (JSONException e) { - e.printStackTrace(); } - return null; + return userFlairs; + } catch (JSONException e) { + e.printStackTrace(); } + return null; + } - @Override - protected void onPostExecute(ArrayList userFlairs) { - if (userFlairs != null) { - parseFlairsAsyncTaskListener.parseSuccessful(userFlairs); - } else { - parseFlairsAsyncTaskListener.parseFailed(); - } - } + public interface FetchUserFlairsInSubredditListener { + void fetchSuccessful(@Nullable ArrayList userFlairs); - interface ParseUserFlairsAsyncTaskListener { - void parseSuccessful(ArrayList userFlairs); - - void parseFailed(); - } + void fetchFailed(); } }