2016-06-24 30 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這裏是如何使用它的教程 –