2012-04-12 3 views
0

내 ProgressDialog가 표시되지 않습니다. 내 프로그램에서 사용자가 팝업 메뉴에서 비트 전송률을 선택하면 콘텐츠가 온라인으로 가져와 VideoView에 표시됩니다.ProgressDialog가 제대로 표시되지 않는 이유는 무엇입니까?

그러나 비디오가로드되고 progressDialog가 비디오가로드되기 전에 끝에 두 번째 (또는 그 이하)의 분량으로 표시되는 동안 검은 화면이 나타납니다. 새로운 코드와

private void showPopupMenu(View v){ 
    popupMenu = new PopupMenu(VideoPlayer.this, v); 
    if(bitRates != null){ 
     int menuItem = 0; 
     int index = bitRates.size()-1; 
     popupMenu.getMenu().add(0,menuItem, 0,"Hide menu"); 
      for(int i=1;i<bitRates.size();i++){ 
       menuItem = i; 

       popupMenu.getMenu().add(0,menuItem, 0,"Quality"+" : "+bitrateCheck(bitRates.get(index))).setCheckable(true); 
       Log.i("ITEM",qualityList.get(i)+" : "+bitRates.get(i)); 
       index--; 
      } 
      popupMenu.getMenu().add(0,menuItem++, 0,"Catalog"); 

     } 
    popupMenu.show(); 
    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 

    public boolean onMenuItemClick(final MenuItem item) { 
     p_dialog = ProgressDialog.show(VideoPlayer.this, "", "Loading..."); 

     //get current position of video to seek to 
     final int position = mVideoView.getCurrentPosition(); 
     new Thread() { 

      public void run() { 

       try{ 

        runOnUiThread(new Runnable() { 
         public void run() { 

          if(item.getTitle().equals("Catalog")){ 
           backButtonVideo(new View(VideoPlayer.this)); 
          } 
          else if(item.getTitle().equals("Hide menu")){ 
           popupMenu.dismiss(); 
           mVideoView.start();        
          } 
          else{ 
           play(streamUrls.get(item.getItemId()),position); 

          } 
         } 
        }); 


       } 
       catch (Exception e) { 
        Log.e("tag", e.getMessage()); 

       } 
       p_dialog.dismiss(); 
      } 

     }.start(); 

     return true; 

    } 
    }); 

} 


public void play(String _videoUri, int position){ 
     Log.i(TAG,"URI is : "+Uri.parse(_videoUri).toString());   
     //View view = new View() 
     MediaController mc = new MediaController(VideoPlayer.this); 
     mVideoView.setMediaController(mc); 
     mVideoView.setVideoURI(Uri.parse(_videoUri)); 
     mVideoView.requestFocus(); 
     mVideoView.seekTo(position); 
     mVideoView.start(); 

    } 

는 //////////////////////// 편집 : 제안에 따라 /////////// ////////// 이제 대화 상자가 전혀 표시되지 않습니다.

 mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 

    public void onPrepared(MediaPlayer mp) { 
     // TODO Auto-generated method stub 
     mVideoView.start(); 

    } 
}); 

/////////////////////////////////////////// ///////////////////////////////

popupMenu.show(); 
    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 

    public boolean onMenuItemClick(final MenuItem item) {  
     //get current position of video to seek to 
     final int position = mVideoView.getCurrentPosition(); 
     p_dialog = ProgressDialog.show(VideoPlayer.this, "", "Loading..."); 
     try{ 
      if(item.getTitle().equals("Catalog")){ 
       backButtonVideo(new View(VideoPlayer.this)); 
      } 
      else if(item.getTitle().equals("Hide menu")){ 
       popupMenu.dismiss(); 
       mVideoView.start();        
      } 
      else{ 
       play(streamUrls.get(item.getItemId()),position);        
      } 

     } 
     catch (Exception e) {Log.e("tag", e.getMessage());} 
     return true; 
    } 
    }); 

} 


    public void play(String _videoUri, int position){ 
     Log.i(TAG,"URI is : "+Uri.parse(_videoUri).toString());   
     MediaController mc = new MediaController(VideoPlayer.this); 
     mVideoView.setMediaController(mc); 
     mVideoView.setVideoURI(Uri.parse(_videoUri)); 
     mVideoView.requestFocus(); 
     mVideoView.seekTo(position); 
     p_dialog.dismiss(); 
    } 
+0

나는 당신이 uithread에서 모든 것을하고 있다면 의심 스럽다. 그런데 왜 새로운 스레드를 만들고 나서 runonuithread를 사용하고 있는가? – 5hssba

+0

@raju, runOnUiThread없이 play() 메서드가 호출되지 않습니다. – Fabii

+0

@raju, Im이 (가) 새 스레드를 제거하고 uithread를 보관했지만 문제가 여전히 발생합니다. uiThread를 없애려면 looper.prepare() 문제가 발생합니다. – Fabii

답변

1

첫째, it UI 스레드에서 뭔가를 실행하기 위해서만 별도의 스레드를 만드는 것은 의미가 없습니다 (왜 처음부터 스레드를 생성합니까?).

onMenuItemClick은 UI 스레드에 의해 이미 호출되어야합니다 (UI 요소의 콜백은 일반적으로이를 수행합니다).

당신이보아야 할 것은 MediaPlayer.OnPreparedListenerVideoView.setOnPreparedListener을 사용하고 있습니다. 이렇게하면 비디오를 재생할 준비가 된 시점을 알 수 있습니다.

+0

편집 내용을 확인하십시오. 대화 상자가 전혀 표시되지 않습니다. 어떤 제안? – Fabii

+0

아직 'OnPreparedListener'를 사용하지 않았습니다 : http://developer.android.com/reference/android/widget/VideoView.html#setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener) –

+0

코드를 재 배열했는데, 지금해야 할 일이 있습니다. 친절하게 감사드립니다. – Fabii

0

나는 Che Jami에 따라 약간의 재배치를하고 작동하도록했습니다. 감사합니다

 mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {  
    public void onPrepared(MediaPlayer mp) { 
     // TODO Auto-generated method stub 
     p_dialog.dismiss(); 
     mVideoView.start(); 


    } 
}); 

////////////////////////////////////////// //////////////////////////////////////

 popupMenu.show(); 
    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 

    public boolean onMenuItemClick(final MenuItem item) {  
     //get current position of video to seek to 
     final int position = mVideoView.getCurrentPosition(); 

     try{ 
      if(item.getTitle().equals("Catalog")){ 
       backButtonVideo(new View(VideoPlayer.this)); 
      } 
      else if(item.getTitle().equals("Hide menu")){ 
       popupMenu.dismiss(); 
       mVideoView.start();        
      } 
      else{ 
       p_dialog = ProgressDialog.show(VideoPlayer.this, "", "Loading new stream"); 
       play(streamUrls.get(item.getItemId()),position);        
      } 

     } 
     catch (Exception e) {Log.e("tag", e.getMessage());} 
     return true; 
    } 
    }); 

}

public void play(String _videoUri, int position){ 
     Log.i(TAG,"URI is : "+Uri.parse(_videoUri).toString()); 



    MediaController mc = new MediaController(VideoPlayer.this); 
    mVideoView.setMediaController(mc); 
    mVideoView.setVideoURI(Uri.parse(_videoUri)); 
    mVideoView.requestFocus(); 
    mVideoView.seekTo(position); 
것 같다 ...
+0

그건 내 ponit .. 불필요하게 스레드를 사용하는 이유 .. : D – 5hssba

0

내가 같은 문제가

은} ... 난 당신 솔루션을 시도했지만 내 진행 ... 모든 차단 중지됩니다 ... 그리고 비디오가 표시되지 않습니다 그 onPrepareListener 결코 호출되지 않습니다 ... 어떤 아이디어? 또한 setVideoURI 코드에서 전달한 적이없는 것 같습니다 :/

스레드와 runOnUI, AsyncTask, 모든 않고 ... 아무것도 작동하지 않는 것 같습니다. 무언가는 항상 빠져 있습니다.

편집 :

내가 여기에 어떤 스레드가없는 당신 같은 코드 OnClickListener를

에 전화 했어 기능이 있습니다

버전 1 : 비디오가 몇 초 후에 시작, 진행 그냥 대화 동영상이 시작될 때 잠시 동안 보여줍니다. 진행은 처음부터 보여지지 않습니다. 스레드와 핸들러와

public void loadService(final int mode) { 

    //Version 1 

    // Show dialog 
    loadService = new ProgressDialog(activity); 

    loadService.setTitle("Loading service"); 
    loadService.setMessage("Please wait..."); 
    loadService.setCancelable(false); 
    loadService.show(); 

    // Hide progress dialog after 15 seconds if nothing happens 
    DuoTVGuiHandler.progressBarProttection(loadService, 15); 

    // Setup video view for playback 
    if (mode == STAND_ALONE) { 
     setupVideoView(((DuoTVGuiActivity) activity).getVideoPlayback()); 
    } 

    if (mode == WIDGET_MODE) { 
     setupVideoView(((MainActivity) activity).getVideoViewWidgetMode()); 
    } 
} 

/** Setup video view for playback */ 
public void setupVideoView(final VideoView videoView) { 

    videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 

     public void onPrepared(MediaPlayer mp) { 
      loadService.dismiss(); 
      videoView.start(); 
     } 
    }); 

    videoView.setVideoURI(Uri.parse(channels.get(index).getFilePath())); 

} 

버전 2 ... 진행 대화 상자가 ... 그 회전이 ... 비디오 ... 두 번째 및 UI 예외을위한 응용 프로그램 충돌 ... WrongThread에 대한 표시로 보여 ... 하지만 runOnUiThread에서 setVideoURI를 움직이면 ... 진행 상태가 영원히 유지되고 ... setOnVideoURI가 끝나지 않습니다.

public void loadService(final int mode) { 

    // ////////////////////////////// 
    // Version 2 
    // ////////////////////////////// 

    // Show dialog 
    loadService = new ProgressDialog(activity); 

    loadService.setTitle("Loading service"); 
    loadService.setMessage("Please wait..."); 
    loadService.setCancelable(false); 
    loadService.show(); 

    final Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 

      loadService.dismiss(); 

      super.handleMessage(msg); 
     } 
    }; 

    Thread loadVideoPath = new Thread(new Runnable() { 

     public void run() { 
      if (mode == STAND_ALONE) { 
       ((DuoTVGuiActivity) activity) 
         .getVideoPlayback() 
         .setVideoURI(
           Uri.parse(channels.get(index).getFilePath())); 
      } 

      if (mode == WIDGET_MODE) { 
       ((MainActivity) activity) 
         .getVideoViewWidgetMode() 
         .setVideoURI(
           Uri.parse(channels.get(index).getFilePath())); 
      } 

      handler.sendEmptyMessage(0); 
     } 
    }); 

    loadVideoPath.start(); 
} 

... 나는 이것에 며칠을 잃었습니다 ... 당신이 어떤 생각을 가지고 희망하고 캔트이 아주 기본적인 일을 위해 ... 솔루션을 볼 수 ... 그것은 날 미친 드라이브 :

+0

우리는 좀 걸릴 수 있도록 몇 가지 코드를 게시 할 수 있습니까? – Fabii

+0

내 질문을 업데이트했습니다. 행운을 빕니다! – Veljko

+0

또한 스레드와 코드가 2.3.3에서 작동한다는 것을 알았습니다. :) 2.2에서 WrontThreadException을 사용했습니다. – Veljko

관련 문제