2016-06-24 4 views
0

내 앱은 메인 스레드에서 너무 많은 작업을하고 있으며, UI를 터치하기 전에 앱이 처음로드 될 때까지 충분히 기다리지 않으면 충돌합니다. 특히, 그것은 'myVideoView.setVideoURI'줄을 주석으로 때문에 완전히 작동합니다 때문에 비디오 뷰에로드 할 비디오 기다리고 있어요 것 같습니다.안드로이드는 백그라운드에서 비디오 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); 

     } 
    }); 

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

예, 솔루션 - 사용 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 여기 사용 방법에 대한 자습서입니다. –

관련 문제