[英]OkHttp Fatal Exception when running on Android device
我正在嘗試構建一個應用程序來復制視頻流。 我遇到了一個似乎無法解決的問題。
該應用程序在模擬器中運行時運行良好(嘗試了一些模擬設備),但它在我運行 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 的最后一部分。
我非常感謝任何幫助謝謝
我仔細檢查了我是否多次閱讀/使用響應正文。
正如@zaitsman 指出的那樣,問題出在后台線程上,同時試圖修改 UI。
我通過更改解決了它:
setBannerMoviesPagerAdapter(bannerMoviesList);
到以下內容:
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
setBannerMoviesPagerAdapter(bannerMoviesList);
}
});
改變
setBannerMoviesPagerAdapter(bannerMoviesList);
到
new android.os.Handler(android.os.Looper.getMainLooper()).post({
setBannerMoviesPagerAdapter(bannerMoviesList);
});
本質上,您是在嘗試從后台線程(該線程歸 OKHttp 所有)修改 UI(設置適配器)。 您需要分派回主線程。
我展示的方法是通用的,可以在任何地方使用。
或者,如果你能找到你可以做的活動
getActivity().runOnUiThread({
setBannerMoviesPagerAdapter(bannerMoviesList);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.