Возвращение ArrayList из AsyncTask

1

Я пытаюсь получить URL-адреса песен с сервера. Я хочу получить все URL-адреса в arraylist, которые могут быть показаны в представлении переработчика в следующем упражнении. URL-адреса корректно получаются, когда я пытаюсь просмотреть их с помощью Toast или log. Но когда я пытаюсь получить их как возвращаемый результат AsyncTask, он показывает size = 0 для возвращенного массива. Я следил за ответами на этот вопрос специально от Blackbelt. Но это оказалось бесполезным. Комментарии к этому ответу отключены. Итак, здесь я публикую свой вопрос с измененным кодом. Вот код, который я написал.

    interface OnFetchUrlsListener
    {
        public void onUrlsFetched(ArrayList<String> arrayList);
        public void onUrlsError(String error);
    }

     public class SplashScreen extends AppCompatActivity implements OnFetchUrlsListener{

    @Override
    public void onUrlsFetched(ArrayList<String> arrayList) {
        Toast.makeText(this, "result size : "+arrayList.size(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUrlsError(String error) {

    }

    private static RequestQueue mQueue;
    public static ArrayList<String> songsArray ;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);
        songsArray = new ArrayList<String>();
        String uri = Uri.parse("https://dee9c999.ngrok.io/audio/data/WebsiteSourceCode/api/all_songs.php/?allsongs=allsongs").toString();
        new FetchSongs(this).execute(uri);

    }

    private class FetchSongs extends AsyncTask<String, String, ArrayList<String>> {
        private OnFetchUrlsListener mListener;
        public FetchSongs(OnFetchUrlsListener listener){
            mListener = listener;
        }

        @Override
        protected ArrayList<String> doInBackground(String... params) {
            //some heavy processing resulting in a Data String
            JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, params[0], null,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            try {
                                JSONArray jsonArray = response.getJSONArray("data");

                                for (int i = 0; i < jsonArray.length(); i++) {
                                    songsArray.add(jsonArray.getString(i));
                                }

                            }
                            catch (JSONException e) {
                                e.printStackTrace();
                                Log.d("JSON Parse", String.valueOf(e));
                            }

                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();
                    Toast.makeText(SplashScreen.this, "Load error!!", Toast.LENGTH_SHORT).show();
                }
            });
            mQueue.add(request);
            return songsArray;
        }

        @Override
        protected void onPreExecute() {}

        @Override
        protected void onPostExecute(ArrayList<String> result) {

            if(mListener!=null)
            {
                mListener.onUrlsFetched(result);
            }
        }
    }
}

[Редактировать]

 private ArrayList<String> startHeavyProcessing(String uri) {
        final ArrayList<String> result = new ArrayList<String>();
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, uri, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray jsonArray = response.getJSONArray("data");

                            for (int i = 0; i < jsonArray.length(); i++) {
                                result.add(jsonArray.getString(i));
                                Toast.makeText(SplashScreen.this, jsonArray.getString(i), Toast.LENGTH_SHORT).show();
                            }
                            songs_fetched = true;

                        }
                        catch (JSONException e) {
                            e.printStackTrace();
                            songs_fetched = false;
                            Log.d("JSON Parse", String.valueOf(e));
                        }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
                Toast.makeText(SplashScreen.this, "Load error!!", Toast.LENGTH_SHORT).show();
            }
        });
        mQueue.add(request);
        return result;
    }

Теперь, когда я пытаюсь напечатать результат функции startHeavyProcessing(), он возвращает массив с размером 0, но внутри функции он получает URL-адреса песен совершенно нормально.

Теги:
android-asynctask

2 ответа

1
Лучший ответ

Я решил Твою проблему по-другому...

  1. как обычно, определите этот интерфейс

    public interface OnFetchUrlsListener {
        void onUrlsFetched(ArrayList<String> arrayList);
        void onUrlsError(String error);
    }
    
  2. запишите класс, скажем, VolleyCall, где будет происходить запрос на получение залпа и результат/ответ будет возвращен с использованием слушателя

    public class VolleyCall {
        private String TAG = VolleyCall.class.getSimpleName();
        private String mUrl;
        private OnFetchUrlsListener mOnFetchUrlsListener;
        private ArrayList<String> mSongs;
        private RequestQueue mQueue;
    
        public VolleyCall(Context context, String url, OnFetchUrlsListener onFetchUrlsListener) {
            mSongs = new ArrayList<>();
            mUrl = url;
            mOnFetchUrlsListener = onFetchUrlsListener;
    
            mQueue = Volley.newRequestQueue(context);
        }
    
        public void parse() {
            JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, mUrl, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            Log.e(TAG, "_log : onResponse : response : " + response.toString());
                            JSONArray jsonArray = response.getJSONArray("data");
    
                            for (int i = 0; i < jsonArray.length(); i++) {
                                mSongs.add(jsonArray.getString(i));
                            }
    
                            mOnFetchUrlsListener.onUrlsFetched(mSongs);
    
                        } catch (JSONException e) {
                            Log.e(TAG, "_log : onResponse : JSONException : " + e.getMessage());
                        }
    
                    }
                }, new Response.ErrorListener() {
             @Override
             public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "_log : onErrorResponse : error : " + error.getMessage());
                mOnFetchUrlsListener.onUrlsError(error.getMessage());
            }
        });
    
        mQueue.add(request);
        Log.e(TAG, "_log : songsArray_size : " + mSongs.size());
        }
    }
    
  3. изменить основной вид деятельности

    public class SplashScreen extends AppCompatActivity implements OnFetchUrlsListener {
    
        private String TAG = SplashScreen.class.getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            String url = "https://dee9c999.ngrok.io/audio/data/WebsiteSourceCode/api/all_songs.php/?allsongs=allsongs";
            VolleyCall call = new VolleyCall(SplashScreen.this, url, SplashScreen.this);
            call.parse();
        }
    
        @Override
        public void onUrlsFetched(ArrayList<String> arrayList) {
            Log.e(TAG, "_log : onUrlsFetched : is_arrayList_null : " + (arrayList == null));
            if (arrayList != null) {
                Log.e(TAG, "_log : onUrlsFetched : arrayList_size : " + arrayList.size());
            }
    
            String file_names = "";
            for (String s : arrayList) {
                file_names = file_names.concat(s + "\n");
            }
    
           TextView tv = findViewById(R.id.text);
           tv.setText(file_names);
        }
    
        @Override
        public void onUrlsError(String error) {
            Log.e(TAG, "_log : onUrlsError : " + error);
        }
    }
    
  • 0
    Является ли размещение mOnFetchUrlsListener.onUrlsFetched (mSongs) причиной для решения проблемы? Спасибо чувак :)
0

Попробуйте это, вам не нужно возвращать arraylist, если вы используете это, в конце функции arraylist будет иметь все значения

ArrayList<String> result = new ArrayList<>();
        private void startHeavyProcessing(String uri) {

            JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, uri, null,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            try {
                                JSONArray jsonArray = response.getJSONArray("data");

                                for (int i = 0; i < jsonArray.length(); i++) {
                                    result.add(jsonArray.getString(i));
                                }

                            }
                            catch (JSONException e) {
                                e.printStackTrace();

                                Log.d("JSON Parse", String.valueOf(e));
                            }

                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();

                }
            });
            mQueue.add(request);
        }
  • 0
    Спасибо за попытку .. но это не решает мою проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню