簡體   English   中英

在 Android 設備上運行時出現 OkHttp 致命異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM