您的位置:

解决方案:glide RuntimeException(thread.exception)

  发布时间:2023-01-26 22:30:02
报错的原因在Java中,Glide出现的原因可能是因为在主线程中调用了Glide的方法。这可以通过使用AsyncTask、Handler或线程池来实现。例如,使用AsyncTask加载图片在后台线程中调用Glide加载图片在主线程中更新或使用如果你使用线程池,可以使用Executor类,将线程提交到线程池中执行选择你喜欢的方法使用即可。使用例子以下是使用 Glide 在后台线程中加载图片,并在主线程中显示图片的示例代码使用这种方法,你可以在主线程中调用方法,而不用担心会出现的异常。

报错的原因

在Java中,Glide出现RuntimeException(thread.exception)的原因可能是因为在主线程中调用了Glide的方法。Glide在加载图片时需要在后台线程中进行操作,如果在主线程中调用,将会导致异常。

如何解决

要解决这个问题,应该在后台线程中调用Glide的方法,而不是在主线程中。这可以通过使用AsyncTask、Handler或线程池来实现。

例如,使用AsyncTask加载图片:


new AsyncTask() {
    @Override
    protected Bitmap doInBackground(Void... params) {
        // 在后台线程中调用Glide加载图片
        return Glide.with(context)
                .load(imageUrl)
                .asBitmap()
                .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                .get();
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        // 在主线程中更新UI
        imageView.setImageBitmap(bitmap);
    }
}.execute();

或使用handler:


new Thread() {
    @Override
    public void run() {
        final Bitmap bitmap = Glide.with(context)
                .load(imageUrl)
                .asBitmap()
                .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                .get();

        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                imageView.setImageBitmap(bitmap);
            }
        });
    }
}.start();

如果你使用线程池,可以使用Executor类,将线程提交到线程池中执行。


Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
    @Override
    public void run() {
        final Bitmap bitmap = Glide.with(context)
                .load(imageUrl)
                .asBitmap()
                .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                .get();

        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                imageView.setImageBitmap(bitmap);
            }
        });
    }
});

选择你喜欢的方法使用即可。

使用例子

以下是使用 Glide 在后台线程中加载图片,并在主线程中显示图片的示例代码:


private void loadImageWithGlide() {
    // Create a background thread using an AsyncTask
    new AsyncTask() {
        @Override
        protected Bitmap doInBackground(Void... params) {
            // Load image in the background
            try {
                return Glide.with(context)
                        .asBitmap()
                        .load(imageUrl)
                        .submit()
                        .get();
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
                return null;
            }
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            // Update the image view in the main thread
            if (bitmap != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }.execute();
}

使用这种方法,你可以在主线程中调用 `loadImageWithGlide()` 方法,而不用担心会出现 `thread.exception` 的异常。

另外还可以使用 glide4.x 的 Listener 方式进行加载图片,不用自己手写线程去加载,这样更简单方便。


Glide.with(context)
        .load(imageUrl)
        .listener(new RequestListener() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
                // 加载失败
                return false;
            }

            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
                // 加载成功
                imageView.setImageDrawable(resource);
                return false;
            }
        }).into(imageView);

以上两种方式都可以解决你的问题。