0

ProgressDialogが表示されません。私のプログラムでは、ユーザーがポップアップメニューからビットレートを選択すると、コンテンツがオンラインでフェッチされ、VideoViewに表示されます。

ただし、ビデオがロードされている間は黒い画面しか表示されず、ビデオが最終的にロードされる前に、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();
  }
4

3 に答える 3

1

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

onMenuItemClickUIスレッドによってすでに呼び出されている必要があります(UI要素のコールバックは通常これを行います)。

注目すべきは、MediaPlayer.OnPreparedListenerwithを使用することVideoView.setOnPreparedListenerです。これにより、ビデオを再生する準備ができたことがわかります。

于 2012-04-12T15:44:14.727 に答える
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);

}

于 2012-04-12T16:15:02.527 に答える
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...進行状況ダイアログが表示されます...その回転...ビデオが1秒間表示され、アプリがクラッシュします...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();
}

あなたがいくつかのアイデアを持っていることを願っています...私はこれで数日を失いました...そして解決策を見ることができません...このかなり基本的なことのために...それは私を夢中にさせます:)

于 2012-05-16T08:53:30.980 に答える