为什么我的 Android ImageView 是空的通过 Uri、Bitmap 或使用 Picasso 加载

问题描述

我有一个片段来显示任一图像视频的队列。我在 VideoView 中显示的视频工作正常,可以重播,效果很好。但是我放在 ImageView 中的图像只是不可见。我尝试通过 Uri 加载它们,通过读取位图,现在它们是用毕加索设置的,但没有一个修复它。到目前为止,您将在 MultimediaPlayer 中看到的 AssetObtainer 可以处理声音文件和视频,因此我非常怀疑它是否存在图像问题。代码如下:

多媒体播放器.java :

public class MultimediaPlayer extends Fragment
{
    VideoView mVideoView;
    ImageView mImageView;
    MultimediaViewModel mMultimediaViewModel;
    Play mPlayThread;
    Activity mActivity;
    AssetObtainer assetObtainer = new AssetObtainer();
    public Long mTutorialId;
    public List<Multimedia> multimedias = new LinkedList<>();

    @Override
    public View onCreateView(@NotNull LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.fragment_multimedia_player,container,false);
    }

    @Override
    public void onViewCreated(View view,Bundle savedInstanceState)
    {
        mActivity = requireActivity();
        mMultimediaViewModel = new ViewModelProvider(this).get(MultimediaViewModel.class);
        mVideoView = view.findViewById(R.id.video_embed);
        mImageView = view.findViewById(R.id.image_embed);
        getPlayer(0);
    }

    private void getPlayer(int position)
    {
        if(mPlayThread != null) {
            mPlayThread.interrupt();
            position++;
        }
        if(!multimedias.isEmpty()) {
            mPlayThread = new Play(multimedias.get(position));
            mPlayThread.start();
        }
    }

    private class Play extends Thread
    {
        private final Multimedia currentMedia;

        Play(Multimedia media){
            currentMedia = media;
        }

        @Override
        public void run()
        {
            int position = currentMedia.getPosition();
            int displayTime = currentMedia.getDisplayTime();
            boolean loopBool = currentMedia.getLoop();
            if(currentMedia.getType()) {
                mActivity.runOnUiThread(() -> {
                    mImageView.setVisibility(View.VISIBLE);
                    mVideoView.setVisibility(View.GONE);
                    try {
                        Picasso.get().load(assetObtainer.getFileFromAssets(requireContext(),currentMedia.getFullFileName())).into(mImageView);
                    } catch (IOException ignored) {}
                });
                if(displayTime>0) {
                    try {
                        sleep(displayTime);
                        if(!loopBool) multimedias.remove(currentMedia);
                        if(position<multimedias.size()-1) {
                            getPlayer(position);
                        } else getPlayer(0);
                    } catch (InterruptedException e) {
                        mActivity.runOnUiThread(() -> mImageView.setVisibility(View.GONE));
                        interrupt();
                    }
                }
            } else {
                mActivity.runOnUiThread(() -> {
                    mVideoView.setVisibility(View.VISIBLE);
                    mImageView.setVisibility(View.GONE);
                    try {
                        mVideoView.setVideoURI(Uri.fromFile(assetObtainer.getFileFromAssets(requireContext(),currentMedia.getFullFileName())));
                    } catch (IOException ignored) {}
                    if(loopBool && multimedias.size()==1) mVideoView.setOnCompletionListener(v->getPlayer(position-1));
                    mVideoView.start();
                });
            }
        }
    }

    @Override
    public void onPause()
    {
        if(mPlayThread!=null){
            mPlayThread.interrupt();
        }
        super.onPause();
    }
}

用于活动 .xml 文件中的片段:

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/layout_multimedia"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/active_instructions" />

和片段的 .xml 文件:

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context=".tutorial.mediaplayer.MultimediaPlayer">

    <VideoView
        android:id="@+id/video_embed"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/image_embed"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        android:contentDescription="@string/image_default_no_description" />

</androidx.constraintlayout.widget.ConstraintLayout>

如前所述,视频效果非常好,但无法显示图像。在我必须完全重新设计之前,我什至会感谢猴子扳手的建议。

解决方法

正如我在另一个答案中提到的,它与 ImageView 无关,这是 SQLite 和从数据库加载布尔值的问题。我想与视频类型对应的默认 false 是默认的,所以它起作用了,但由于它没有默认为 true,所以图像条件没有得到满足。无论如何,一旦实际运行 ImageView 就会工作。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...