2012-04-12 33 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、私は新しいスレッドを削除し、uスレッドを保持していますが、問題はまだ発生しています。もしuiThreadを取り除くなら、私はlooper.prepare()の問題に遭遇するでしょう。 – Fabii

答えて

1

まず、it別のスレッドを作成してUIスレッドで何かを実行するだけでは意味がありません(最初にスレッドを作成するのはなぜですか?)。

onMenuItemClickは、UIスレッドによって既に呼び出されている必要があります(UI要素のコールバックでは一般的にこれが行われます)。

MediaPlayer.OnPreparedListenerにはVideoView.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

これは私のポニットです...なぜ不必要にスレッドを使用するのですか?:D – 5hssba

0

私は同じ問題を抱えている...私はそれはそうです...あなたのソリューションを試してみたが、私の進捗状況がブロックされます...すべてが停止して...とビデオが表示されませんonPrepareListenerは決して呼び出されません...任意のアイデア?また、setVideoURIがコードで渡されたことはありません:/

私は、スレッドと、runOnUIで、AsyncTaskを使って、何もせずに...何も完全には動作していないようです。何かが常に欠けている。

EDIT:

私はここで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

+0

質問を更新しました。がんばろう! – Veljko

+0

また、スレッドのコードが2.3.3で動作することに気付きました:)しかし、2.2ではWrontThreadExceptionが発生しました – Veljko

関連する問題