我的应用程序一直告诉我,我在主线程上做了太多工作,如果我在应用程序首次加载之前等待的时间不长,那么它会崩溃。具体来说,似乎我正在等待的视频加载到videoView中,因为当我注释掉“myVideoView.setVideoURI”时,它完全没问题。
我已经设置了一个用于与服务器通信的asynctask,所以我想也许我可以使用asynctask如何在后台设置视频,然后在完成后隐藏进度条。
我尝试将我的整个视频加载代码放在asynctask中,但它一直在说'这必须在UI线程上完成'#39;。当然,我可能只是误解了多线程的概念,但是如果有人能帮我澄清我如何减少主线程的压力,那就太好了。谢谢!
这是我的代码示例。所有这些目前都在onCreate。
myVideoView = (VideoView) findViewById(R.id.videoView);
try {
myVideoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.video));
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
myVideoView.requestFocus();
myVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mediaPlayer) {
myVideoView.seekTo(0);
}
});
// EMPTY ASYNCTASK
public class LoadVideo extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// DO SOMETHING BEFORE IT STARTS
}
protected String doInBackground(String... args) {
// DO HEAVY LIFTING
return null;
}
protected void onPostExecute(String file_url) {
// DO SOMETHING AFTER IT FINISHES
}
}
答案 0 :(得分:0)
是的,有一个解决方案 - 使用rxJava多线程。它允许在一个线程上创建请求,在另一个线程上执行它(例如计算)并在主线程上处理结果。这是处理多线程的现代方法。我在目前的项目中经常使用它。 请参阅评论https://stackoverflow.com/a/38002606/6175778