从AsyncTask返回ArrayList

时间:2019-03-07 04:23:05

标签: android android-asynctask

我正在尝试从服务器获取歌曲的网址。我想在arraylist中获取所有网址,这些网址可以在下一个活动的回收站视图中显示。当我尝试使用Toast或日志查看URL时,URL正确接收。但是,当我尝试获取它们作为AsyncTask的返回结果时,它显示返回的arraylist的size = 0。我特别关注this questionBlackbelt的回答。但这被证明是没有用的。该答案已禁用评论。所以,我在这里用修改后的代码发布我的问题。这是我编写的代码。

    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完全正常。

2 个答案:

答案 0 :(得分:1)

我以另一种方式解决了您的问题...

  1. 照常定义此接口

    public interface OnFetchUrlsListener {
        void onUrlsFetched(ArrayList<String> arrayList);
        void onUrlsError(String error);
    }
    
  2. 写下一个类,例如VolleyCall,其中发生volley get请求并使用侦听器返回结果/响应

    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);
        }
    }
    

答案 1 :(得分: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);
        }