2012-04-12 181 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 2012-04-12 15:32:05

+0

@raju,沒有runOnUiThread我的play()方法永遠不會被調用。 – Fabii 2012-04-12 15:33:36

+0

@raju,Im刪除了新線程並保留了uithread,問題仍在發生。如果要擺脫uiThread我會遇到一個looper.prepare()問題。 – Fabii 2012-04-12 15:44:08

回答

1

首先,它沒有意義創建一個單獨的線程只是爲了在UI線程上運行某些東西(爲什麼您首先創建線程呢?)。

onMenuItemClick應該已經被UI線程調用(UI元素的回調通常會這樣做)。

你應該看看是使用一個MediaPlayer.OnPreparedListenerVideoView.setOnPreparedListener。這會告訴您何時可以播放視頻。

+0

請檢查我的編輯,現在對話框根本不顯示。有什麼建議麼 ? – Fabii 2012-04-12 16:05:02

+0

你還沒有使用'OnPreparedListener': http://developer.android.com/reference/android/widget/VideoView.html#setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener) – 2012-04-12 16:15:08

+0

我重新安排了代碼,它現在正在工作,謝謝你。 – Fabii 2012-04-12 16:16:34

0

我根據車雅米做了一些重新安排,並讓它工作。謝謝

 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 2012-04-13 04:05:02

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線程和處理器...進度對話框顯示...紡紗......視頻顯示了第二... ...和應用程序崩潰... WrongThread的UI例外...但是當我在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 2012-05-16 19:54:29

+0

我已更新我的問題。祝你好運! – Veljko 2012-05-17 07:44:01

+0

此外,我已經注意到線程的代碼工作在2.3.3完美:)但在2.2其WrontThreadException – Veljko 2012-05-17 08:07:41

相關問題