2016-06-24 8 views
0

我的应用一直告诉我,我在主线程上做了太多工作,如果在应用第一次加载之前没有足够长的时间来触摸UI,它就会崩溃。具体来说,似乎我正在等待的是将视频加载到videoView中,因为当我注释掉'myVideoView.setVideoURI'这一行时,它完全正常。Android在后台任务中设置视频URI

我已经设置了与服务器通信的asynctask,所以我想也许我可以使用一个asynctask在后台设置视频,然后在完成时隐藏进度条。

我试着把我的整个视频加载代码放在asynctask里面,但它一直说'这必须在UI线程上完成'。当然,我可能只是误解了多线程的概念,但如果有人能够帮助我澄清如何减轻我在主线程中的压力,那就太好了。谢谢!

这是我的代码示例。所有这些目前都在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); 

     } 
    }); 

//空的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

是的,有一个解决方案 - 使用rxJava多线程。它允许在一个线程上创建请求,在另一个线程上执行它(例如计算)并在主线程上处理结果。这是处理多线程的现代方式。我在当前的项目中使用了很多。 查看评论https://stackoverflow.com/a/38002606/6175778

+0

谢谢,我会检查出来的! – user3689720

+0

我试着复制你在评论中的内容,但似乎并未执行。还有什么我必须做的开始呢? – user3689720

+0

https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%204%20-%20Concurrency/1.%20Scheduling%20and%20threading.md这里是如何使用它的教程 –