Как я могу сделать для цикла ожидания в каждой итерации? - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь ждать после каждого цикла for, используя Threads в моем приложении, но у меня проблема. Этот цикл for должен выполняться во время воспроизведения фильма по URL, но ...

К сожалению, цикл выполняется с паузами, которые я вставил в код, и позже фильм начинается с обновления текста. Это должно начаться одновременно. Песня за кругом и фильм. Во время фильма тексты должны обновляться один за другим.

ПРИМЕЧАНИЕ. Я сократил текст ArrayList, чтобы облегчить понимание кода.

ПРИМЕЧАНИЕ2: приложение пытается открыть видеофайл с URL, ноон выдает мне сообщение: W / MediaPlayer: Не удалось открыть (URL видео): java.io.FileNotFoundException: Нет поставщика контента: (Видео URL).

РЕДАКТИРОВАТЬ: я помещаю весь код класса дляyou.


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;
    }
}

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

Я нашел решение. Проблема заключалась в том, что я пытался заснуть тему в обработчике. JVM считала, что основной поток должен быть приостановлен, а не «t». Я переместил метод Thread.sleep () в run () и цикл for тоже. Я оставил только переключатель () в обработчике, чтобы изменить пользовательский интерфейс. Это работает прямо сейчас.

        final Handler h = new Handler() {

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

               Translations x = dict.get(i-1);
                        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;
                            }

                        }

                }


            };


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

                for(i = 0;i<dict.size();i++) {

                    try {
                        Thread.sleep(2000);

                    }catch (InterruptedException e){
                    }

                    if (j < 3) {
                        j++;
                    } else {
                        j = 1;
                    }
                    h.sendEmptyMessage(0);
                }


            }
        };

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



    }
}
0 голосов
/ 03 октября 2019

Зачем вообще цикл? Субтитры, как это делает фрагмент кода, связаны с видео. Что если человек снимает фильм и выполняет быструю перемотку вперед или назад, у большинства установок субтитров на экране есть предложение, связанное с временным кодом для фильма, поэтому вы запускаете субтитр при смене временного кода в воспроизводимом видео и передаететайм-код, поэтому он получит предложение для этой части видео и отобразит его на экране.

...