java - 如何在每次迭代中让 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;
}
}
解决方案
为什么要循环,代码片段正在执行的“字幕”与视频相关联。如果这个人擦洗电影并快进或快退怎么办,大多数字幕设置都会将屏幕上的句子与电影的时间码相关联,因此您可以在播放视频的时间码更改时触发字幕,并传入时间码,因此它将获取视频该部分的句子并将其显示在屏幕上。
推荐阅读
- odoo-11 - 如何修改现有解决方案 ODOO-11 Production 模块以使其在餐厅会计中的自动运行
- r - 在 R 中计算并添加连续 5 天或更长时间低于 2 毫米的降水值
- math - 计算“给定'n'个相邻数字的最大乘积”的不一致行为(D语言)
- django - Django Values + Annotate Avg() 没有正确分组
- aws-sdk-js - aws-sdk(用于 Javascript)应该在 deno 上工作吗?
- javascript - React Native - 将平面列表中所选项目的 id 发送到新屏幕
- nginx - Nginx如何为负载平衡带宽返回静态URL的随机数
- spring - camunda 中的独占网关后,ProcessInstanceQuery 在第二个服务任务中不返回结果
- vba - Visual Basic 将数据作为 json 对象发送到 api
- python-3.x - 如何使 pdfkit(和 wkhtmltopdf)在 Google Colab 上工作?