0

I 360 Video Viewer in meinem Projekt zu implementieren, ich versuche aber ich erhalte eine Fehlermeldung für die Zeile:Methode loadVideoFromAsset muss vom UI-Thread aufgerufen werden

mVrVideoView.loadVideoFromAsset("sea.mp4", options); 

Dies ist der Fehler

Method loadVideoFromAsset must be called from the UI thread, currently inferred 
thread is worker 

Folgendes ist mein Code:

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(); 
     } 
    } 
} 

Bitte helfen. Ich habe mein Bestes versucht, konnte es aber nicht beheben.

+0

Anruf dieser VrVideoView.Options Optionen = new VrVideoView .Optionen(); options.inputType = VrVideoView.Options.TYPE_MONO; mVrVideoView.loadVideoFromAsset ("sea.mp4", Optionen); außerhalb von AsyncTask. Ruf es nicht in doInBackground an. – Abhishek

+0

Wo draußen zu schreiben? Ich versuchte es, aber ohne Erfolg. Ich bin Neuling für Android, versuche zu lernen. Wenn Sie es meinem Code hinzufügen und dann zeigen können, wäre das großartig. Danke vielmals. –

+0

Wo rufen Sie VideoLoaderTask.execute() auf? Probieren Sie diese drei Zeilen Aufruf sofort nach "mVrVideoView.setEventListener (new ActivityEventListener());". Nicht im Hintergrund. – Abhishek

Antwort

0

entfernen AsyncTask Implementierung und Call Erforderliche Methoden UI-Thread

Verwenden Unten Code:

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

danke es half –

0

Ich weiß nicht viel über videoview, aber ich zeige in Ihrem Code, dass Sie versuchen, auf einige Funktionen in doInbackground-Methode zuzugreifen. Die doINbackground-Methode wird in einem separaten Thread vom Benutzeroberflächenthread ausgeführt, sodass komplexe und zeitaufwendige Aufgaben den UI-Thread nicht blockieren. Sie können die Funktionen implementieren Sie in der onCreate Verfahren in doINbackground Verfahren implementieren oder wenn Sie noch doInbackground verwenden müssen, können Sie den UI-Thread innerhalb doInbackground mit runOnUiThread Zugriff wie folgt

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

+0

danke. kannst du mir bitte genau zeigen, wo du den Block Code, den du gabst, setzen kannst. –

+0

geschützt Boolean doInBackground (Void ... Hohlräume) {try { runOnUiThread (neu Runnable() { public void run() {// Code hier VrVideoView.Options Optionen = new VrVideoView.Options(); options.inputType = VrVideoView.Options.TYPE_MONO; mVrVideoView.loadVideoFromAsset ("sea.mp4", Optionen).. } ich erhalte einen Fehler Unhandeled Ausnahme java.io.IOException –

+0

können Ihnen nicht mit diesen Informationen viel helfen. Sie müssen Ihren Code und die Protokollfehler liefern –

Verwandte Themen