2017-06-27 91 views
0

我想實現360度全景視頻查看器在我的項目,但我得到一個錯誤的線被稱爲以下是我的代碼:方法loadVideoFromAsset必須從UI線程

package com.example.jal.jp; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.widget.Button; 
import android.widget.SeekBar; 

import com.google.vr.sdk.widgets.video.VrVideoEventListener; 
import com.google.vr.sdk.widgets.video.VrVideoView; 

import java.io.IOException; 

public abstract class VR_Video extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener { 

    private VrVideoView mVrVideoView; 
    private SeekBar mSeekBar; 
    private Button mVolumeButton; 

    private boolean mIsPaused; 
    private boolean mIsMuted; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_vr__video); 

     initViews(); 

    } 
    public void onPlayPausePressed() { 

    } 

    public void onVolumeToggleClicked() { 

    } 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 

    } 

    private void initViews() { 
     mVrVideoView = (VrVideoView) findViewById(R.id.video_view); 
     mSeekBar = (SeekBar) findViewById(R.id.seek_bar); 
     mVolumeButton = (Button) findViewById(R.id.btn_volume); 
     mVrVideoView.setEventListener(new ActivityEventListener()); 
     mSeekBar.setOnSeekBarChangeListener(this); 
     mVolumeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       onVolumeToggleClicked(); 
      } 
     }); 
    } 
    class VideoLoaderTask extends AsyncTask<Void, Void, Boolean> { 

     @Override 
     protected Boolean doInBackground(Void... voids) { 
      try { 
       VrVideoView.Options options = new VrVideoView.Options(); 
       options.inputType = VrVideoView.Options.TYPE_MONO; 
       mVrVideoView.loadVideoFromAsset("sea.mp4", options); 
      } catch(IOException e) { 
       //Handle exception 
      } 

      return true; 
     } 
    } 
    public void playPause() { 

    } 
    @Override 
    protected void onPause() { 
     super.onPause(); 
     mVrVideoView.pauseRendering(); 
     mIsPaused = true; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mVrVideoView.resumeRendering(); 
     mIsPaused = false; 
    } 

    @Override 
    protected void onDestroy() { 
     mVrVideoView.shutdown(); 
     super.onDestroy(); 
    } 
    private class ActivityEventListener extends VrVideoEventListener { 
     @Override 
     public void onLoadSuccess() { 
      super.onLoadSuccess(); 
     } 

     @Override 
     public void onLoadError(String errorMessage) { 
      super.onLoadError(errorMessage); 
     } 

     @Override 
     public void onClick() { 
      super.onClick(); 
     } 

     @Override 
     public void onNewFrame() { 
      super.onNewFrame(); 
     } 

     @Override 
     public void onCompletion() { 
      super.onCompletion(); 
     } 
    } 
} 

請幫忙。我盡我所能,但無法修復。

+0

呼叫此VrVideoView.Options選項=新VrVideoView可供選項(); options.inputType = VrVideoView.Options.TYPE_MONO; mVrVideoView.loadVideoFromAsset(「sea.mp4」,options); AsyncTask的外側。不要在doInBackground中調用它。 – Abhishek

+0

在哪裏寫外面?我嘗試但無濟於事。我是Android的新手,試圖學習。如果您可以將其添加到我的代碼並顯示,那麼這將是偉大的。非常感謝。 –

+0

你在哪裏調用VideoLoaderTask.execute()?在「mVrVideoView.setEventListener(new ActivityEventListener());」後立即嘗試這三行。不在背景中做。 – Abhishek

回答

0

刪除的AsyncTask實施和呼叫接入內部doInbackground UI線程所需的方法從UI線程

使用下面的代碼:

private void initViews() { 
    mVrVideoView = (VrVideoView) findViewById(R.id.video_view); 
    mSeekBar = (SeekBar) findViewById(R.id.seek_bar); 
    mVolumeButton = (Button) findViewById(R.id.btn_volume); 
    mVrVideoView.setEventListener(new ActivityEventListener()); 
    try { 
      VrVideoView.Options options = new VrVideoView.Options(); 
      options.inputType = VrVideoView.Options.TYPE_MONO; 
      mVrVideoView.loadVideoFromAsset("sea.mp4", options); 
     } catch(IOException e) { 
      //Handle exception 
     } 
    mSeekBar.setOnSeekBarChangeListener(this); 
    mVolumeButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      onVolumeToggleClicked(); 
     } 
    }); 
} 
+0

謝謝它幫助 –

0

我對videoview不太瞭解,但是我在代碼中顯示,您試圖訪問doInbackground方法中的一些功能。 doINbackground方法在UI線程的單獨線程上運行,這樣複雜的,耗時的任務不會阻塞UI線程。你可以實現你要實現在doINbackground方法在onCreate方法的特徵,或者如果你仍然需要使用doInbackground您可以使用runOnUiThread如下

runOnUiThread(new Runnable() { @Override public void run() { //your code here } });

+0

謝謝。你能不能讓我欣喜地把你給的代碼塊放在哪裏? –

+0

保護布爾doInBackground(虛空......空隙){ 嘗試{ runOnUiThread(新的Runnable(){ 公共無效的run(){// 您在這裏的代碼 VrVideoView.Options選項=新VrVideoView.Options(); options.inputType = VrVideoView.Options.TYPE_MONO; mVrVideoView.loadVideoFromAsset( 「sea.mp4」,選項);} 我得到一個錯誤Unhandeled異常java.io.IOException的 –

+0

不能幫助你與這些多的信息。您需要提供您的代碼和日誌錯誤。 –

相關問題