Как получить несколько YouTube PlayListItems на одной странице в Android - PullRequest
0 голосов
/ 10 июля 2020

Я разрабатываю приложение Android, которое извлекает плейлисты с канала и показывает все его видео в каждом плейлисте на одной странице. Но я не знаю, как использовать Asyn c Task для получения этих данных, потому что данные нужно будет получить сразу, но я не знаю, как это сделать. Невозможно использовать параметры в Asyn c Task, и ее также нужно запустить throw al oop, так что есть идеи, что я могу сделать? Кроме того, это приложение предназначено для размещения в Магазине, поэтому оно должно быть разрешено Google. Вот мой код, я получаю идентификаторы и названия списков воспроизведения.

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

}

1 Ответ

0 голосов
/ 10 июля 2020

Можно использовать вот так

    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
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...