【问题标题】:How to fetch multiple YouTube PlayListItems in a single page in Android如何在 Android 的单个页面中获取多个 YouTube PlayListItem
【发布时间】:2020-07-10 11:15:34
【问题描述】:

我正在开发一个 Android 应用程序,它可以从频道中获取播放列表,并在单个页面的每个播放列表中显示其所有视频。但我不知道如何使用异步任务来获取这些数据,因为数据需要立即获取但我不知道如何。不能在异步任务中使用参数,它还需要运行抛出一个循环,所以我能做什么?此外,此应用程序旨在上架商店,因此需要 Google 允许。到目前为止,这是我的代码,我正在获取 PlayList id 和标题。

package com.saikari.bhojpurimovies.activities;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

import com.saikari.bhojpurimovies.R;
import com.saikari.bhojpurimovies.adapters.VerticalRVAdapter;
import com.saikari.bhojpurimovies.models.HorizontalModel;
import com.saikari.bhojpurimovies.models.VerticalModel;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {
    private static String GOOGLE_YOUTUBE_API_KEY = "";
    private static String CHANNEL_ID = "";
    private static String CHANNEL_GET_URL = "https://www.googleapis.com/youtube/v3/playlists?part=snippet&channelId=" + CHANNEL_ID + "&key=" + GOOGLE_YOUTUBE_API_KEY + "&maxResults=50";
    private String play_list_id = null;
    private String VIDEO_LIST_URL = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&key"+GOOGLE_YOUTUBE_API_KEY+"&maxResults=50&playlistId="+play_list_id;

    VerticalRVAdapter adapter;
    RecyclerView verticalRecyclerView;
    ArrayList<VerticalModel> mListData = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        verticalRecyclerView = findViewById(R.id.recycler_view);
        verticalRecyclerView.setHasFixedSize(true);

        initList(mListData);
        new RequestYoutubeAPI().execute();

    }

    private void initList(ArrayList<VerticalModel> mListData) {
        verticalRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new VerticalRVAdapter(this, mListData);
        verticalRecyclerView.setAdapter(adapter);
    }


    private class RequestYoutubeAPI extends AsyncTask<Void, String, String> {

        OkHttpClient httpClient = new OkHttpClient();

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(Void... voids) {
            Request.Builder builder = new Request.Builder();
            builder.url(CHANNEL_GET_URL);
            Request request = builder.build();
            try {
                Response response = httpClient.newCall(request).execute();
                return response.body().string();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String response) {
            super.onPostExecute(response);
            if (response != null) {
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    mListData = parseVideoListFromResponse(jsonObject);
                    initList(mListData);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

        }

    }

    private ArrayList<VerticalModel> parseVideoListFromResponse(JSONObject jsonObject) {
        ArrayList<VerticalModel> mList = new ArrayList<>();
        if (jsonObject.has("items")) {
            try {
                JSONArray jsonArray = jsonObject.getJSONArray("items");
                Log.i("jsonArray", jsonArray.toString());
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject json = jsonArray.getJSONObject(i);
                    if (json.has("id")){
                        play_list_id = json.getString("id");
                    }
                    if (json.has("kind")) {
                        if (json.getString("kind").equals("youtube#playlist")) {
                            VerticalModel vm = new VerticalModel();
                            JSONObject jsonSnippet = json.getJSONObject("snippet");
                            String title = jsonSnippet.getString("title");

                            
                            vm.setCat_title(title);
                            vm.setVidArrayList(arrayListHorizontal);
                            mList.add(vm);
                        }
                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
        return mList;
    }

}

【问题讨论】:

    标签: android youtube-data-api


    【解决方案1】:

    你可以这样使用

        private class AsyncTaskExample extends AsyncTask<String, String, Bitmap> {
                @Override
                protected void onPreExecute() {
                    super.onPreExecute();                                          
                    ProgressDialog p = new ProgressDialog(MainActivity.this);    // User can see it loading on Ui
                    p.setMessage("Please wait...");
                    p.setIndeterminate(false);
                    p.setCancelable(false);
                    p.show();
                }
                @Override
                protected Bitmap doInBackground(String... strings) {
                    try {
                        ImageUrl = new URL(strings[0]);                    // run in background 
                        HttpURLConnection conn = (HttpURLConnection) ImageUrl.openConnection();
                        conn.setDoInput(true);
                        conn.connect();
                        is = conn.getInputStream();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return bmImg;
                }
                @Override
                protected void onPostExecute(Bitmap bitmap) {
                    super.onPostExecute(bitmap);
                                                      // Write code what you want to do after doInBackground() completes
                }
            }
    

    【讨论】:

    • 我知道如何使用异步任务,我的问题是我得到了多个需要获取的 url。那么我该怎么做呢?就像我有一个需要获取的 url 数组,那么用例会是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多