android - 如何在 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;
}
}
解决方案
你可以这样使用
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
}
}
推荐阅读
- node.js - 从 Nodejs 重定向回来后组件不更新
- ionic-framework - ionic3 Http failure response for (unknown url): 0 Unknown Error for android and ios build ,这适用于“离子服务”
- python - 从元组的python列表中提取坐标
- node.js - 使用 .listen() 使用 Firebase 函数
- msbuild - 如何构建声纳扫描仪,得到“MSbuild.exe 无法识别为内部和外部命令”?
- javascript - Javascript动画:淡入完成
- javascript - 在返回的组件实例上没有找到 `render` 方法
- javascript - 写babel插件时如何知道一个变量是不是全局变量
- asp.net-mvc - 创建像 Web Telegram 这样的文本输入
- xml - 使用 Linux 命令将纯字符串转换为 xml 格式