我正在嘗試構建一個應用程式來復制視頻流媒體。我遇到了一個似乎無法解決的問題。
該應用程式在模擬器中運行時運行良好(嘗試了一些模擬設備),但它在我運行 android 12L 的三星 android 平板電腦中 99% 的時間都崩潰了。
我注意到該應用程式在注釋掉
bannerMoviesViewPager.setAdapter(bannerMoviesPagerAdapter);
我希望有人對為什么會發生這種情況有所了解,以及為什么在模擬器中運行時它不會崩潰。以下是我認為可能很重要的代碼段,但如果需要更多,請告訴我(我對堆疊溢位很陌生)
private void setBannerMoviesPagerAdapter(List<BannerMovies> bannerMoviesList){
bannerMoviesViewPager = (ViewPager) findViewById(R.id.banner_viewPager);
bannerMoviesPagerAdapter = new BannerMoviesPagerAdapter(this, bannerMoviesList);
bannerMoviesViewPager.setAdapter(bannerMoviesPagerAdapter); // COMMENT THIS LINE AND IT WORKS
//tabLayout.setupWithViewPager(bannerMoviesViewPager);
Timer sliderTimer = new Timer();
sliderTimer.scheduleAtFixedRate(new AutoSlider(), 4000, 6000);
tabLayout.setupWithViewPager(bannerMoviesViewPager, true);
}
public void fetch_json_banner_list(){
System.out.println("Attempting to fetch JSON");
final String url = "http://*serverIP*:80/api/movie";
Request request = new Request.Builder().url(url).build();
OkHttpClient client = new OkHttpClient();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
System.out.println("Failed to execute request");
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
bannerMoviesList = new ArrayList<>();
String body = response.body().string();
Gson gson = new GsonBuilder().create();
Type allFilmsType = new TypeToken<ArrayList<Film>>(){}.getType();
List<Film> allFilms = gson.fromJson(body, allFilmsType);
for(Film film : allFilms){
System.out.println(film.getArtwork());
System.out.println(film.getArtwork().equals("https://media.movieassets.com/static/images/items/movies/posters/216767680a8a72fff4a12c484c6ac589.jpg"));
bannerMoviesList.add(new BannerMovies(film.getMovieId(), film.getTitle(), film.getSynopsis(), film.getArtwork().trim(), "https://ia800306.us.archive.org/35/items/PopeyeAliBaba/PopeyeAliBaba_512kb.mp4"));
}
setBannerMoviesPagerAdapter(bannerMoviesList);
}
});
}
public class BannerMoviesPagerAdapter extends PagerAdapter {
Context context;
List<BannerMovies> bannerMoviesList;
public BannerMoviesPagerAdapter(Context context, List<BannerMovies> bannerMoviesList) {
this.context = context;
this.bannerMoviesList = bannerMoviesList;
System.out.println("GETS HERE....");
}
@Override
public int getCount() {
return bannerMoviesList.size();
}
此外,這是該程序的 logcat 的最后一部分。
在此處輸入影像描述
我將非常感謝任何幫助謝謝
我仔細檢查了我是否多次閱讀/使用回應正文。
uj5u.com熱心網友回復:
改變
setBannerMoviesPagerAdapter(bannerMoviesList);
至
new android.os.Handler(android.os.Looper.getMainLooper()).post({
setBannerMoviesPagerAdapter(bannerMoviesList);
});
本質上,您正在嘗試從后臺執行緒(該執行緒歸 OKHttp 所有)修改 UI(設定配接器)。您需要分派回主執行緒。
我展示的方法是通用的,可以在任何地方作業。
或者,如果你能找到你的活動,你可以做
getActivity().runOnUiThread({
setBannerMoviesPagerAdapter(bannerMoviesList);
});
uj5u.com熱心網友回復:
正如 zaitsman 指出的那樣,問題出在后臺執行緒上,同時試圖修改 UI。
通過更改解決了
setBannerMoviesPagerAdapter(bannerMoviesList);
至
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
setBannerMoviesPagerAdapter(bannerMoviesList);
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/529195.html
標籤:爪哇安卓好的http
