首页 > 解决方案 > 如何在 Android 的单个页面中获取多个 YouTube PlayListItem

问题描述

我正在开发一个 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;
    }

}

标签: androidyoutube-data-api

解决方案


你可以这样使用

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

推荐阅读