首页 > 解决方案 > 如何在每次迭代中让 for 循环等待?

问题描述

我试图在我的应用程序中使用线程在每个 for 循环之后等待,但我遇到了问题。当播放来自 URL 的电影时,必须执行这个 for 循环,但是......

不幸的是,循环是在我放入代码中的暂停中执行的,后来影片开始时更新了文本。这应该同时开始。for 循环和电影。在电影中,文本应该一个接一个地更新。

注意:我缩短了 ArrayList 字典以使代码更易于理解。

注意 2:该应用程序尝试从 URL 打开视频文件,但它给了我一条消息:W/MediaPlayer:无法打开(视频 URL):java.io.FileNotFoundException:没有内容提供者:(视频 URL)。

编辑:我正在为你放置一个完整的课程代码。


public class Video extends Activity {

    private VideoView videoView;
    private TextView englishTrans1;
    private TextView polishTrans1;
    private TextView englishTrans2;
    private TextView polishTrans2;
    private TextView englishTrans3;
    private TextView polishTrans3;

    int j = 0;
    int i =0;
    public static final String TAG = "My tag";

    ArrayList<Translations> dict = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);

        videoView = findViewById(R.id.video_view1);

        MediaController mMedia = new MediaController(this);

        mMedia.setMediaPlayer(videoView);
        mMedia.setAnchorView(videoView);
        videoView.setMediaController(mMedia);

        String path1 = (HERE IS VIDEO URL);

        Uri uri = Uri.parse(path1);

        videoView.setVideoURI(uri);
        videoView.start();

        englishTrans1 = findViewById(R.id.english_trans1);
        polishTrans1 = findViewById(R.id.polish_trans1);

        englishTrans2 = findViewById(R.id.english_trans2);
        polishTrans2 = findViewById(R.id.polish_trans2);

        englishTrans3 = findViewById(R.id.english_trans3);
        polishTrans3 = findViewById(R.id.polish_trans3);

        dict.add(new Translations("kot","cat"));
        dict.add(new Translations("pies","dog"));
        dict.add(new Translations("kawa","coffee"));
        dict.add(new Translations("herbata","tea"));
        dict.add(new Translations("kościół","church"));
        dict.add(new Translations("ślub","wedding"));

        final Handler h = new Handler() {

            @Override
            public void handleMessage(@NonNull Message msg) {

                for(Translations x : dict){

                    try {
                        synchronized (this) {
                            Thread.sleep(2000);
                        }

                    }catch (InterruptedException e){

                    }
                        switch (j) {
                            case 1: {
                                Log.d(TAG, "First word translated");
                                englishTrans1.setText(x.getEnglishWord());
                                polishTrans1.setText(x.getPolishWord());
                                break;
                            }
                            case 2: {
                                Log.d(TAG, "Second word translated");
                                englishTrans2.setText(x.getEnglishWord());
                                polishTrans2.setText(x.getPolishWord());
                                break;
                            }
                            case 3: {
                                Log.d(TAG, "Third word translated");
                                englishTrans3.setText(x.getEnglishWord());
                                polishTrans3.setText(x.getPolishWord());
                                break;
                            }

                        }
                        if (j < 3) {
                            j++;
                        } else {
                            j = 1;
                        }


                }


            }

        };

        Runnable r = new Runnable() {
            @Override
            public void run() {

                h.sendEmptyMessage(0);

            }
        };

        Thread t = new Thread(r);
        t.start();
    }
}

带有构造函数的 Translations.java 类。

public class Translations {

    private String polishWord;
    private String englishWord;

    public Translations(){
    }

    public Translations(String mPolishWord,String mEnglishWord){
        polishWord = mPolishWord;
        englishWord = mEnglishWord;
    }
    public String getPolishWord() {
        return polishWord;
    }

    public void setPolishWord(String polishWord) {
        this.polishWord = polishWord;
    }

    public String getEnglishWord() {
        return englishWord;
    }

    public void setEnglishWord(String englishWord) {
        this.englishWord = englishWord;
    }
}

标签: javaandroidmultithreadingfor-loop

解决方案


为什么要循环,代码片段正在执行的“字幕”与视频相关联。如果这个人擦洗电影并快进或快退怎么办,大多数字幕设置都会将屏幕上的句子与电影的时间码相关联,因此您可以在播放视频的时间码更改时触发字幕,并传入时间码,因此它将获取视频该部分的句子并将其显示在屏幕上。


推荐阅读