2015-03-14 4 views
0

Я хочу до finish() деятельность VideoPlayer от класса RenderView. Однако вызов finish() от RenderView не позвонил onDestroy(). Активность не уничтожается и не возвращается к предыдущей основной деятельности.Calling finish() от SurfaceView не разрушает Деятельность

public class VideoPlayer extends Activity { 

    @Override 
    protected void onPause(){ 
     super.onPause(); 
     renderView.pause();  
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     naClose2(); 
    } 

} 

mFinished = true, но он возвращается назад к методу parseServerInfo() где finish() был вызван и продолжает выполнение остальной части кода.

EDIT

public class RenderView extends SurfaceView implements SurfaceHolder.Callback { 
    private Context mContext; 

    private Runnable prDisplayVideoTask = new Runnable() { 
     public void run() { 
      if(zoomState.isPlaying()==false){ 
       if(zoomState.getFlag()==FlagType.PAUSE){ 
        zoomState.setFlag(FlagType.NONE); 
        naPause(); 
       } 
      } else { 
       naStart(); 
      } 
      prVideoDisplayHandler.postDelayed(this, prDelay); 
     } 
    }; 

    public RenderView(...) { 
     super(_context); 
     this.mContext = _context; 
     init(address, windowWidth, windowHeight, videoWidth, videoHeight, 
       server_ip, server_port); 
     SurfaceHolder holder = getHolder(); 
     holder.setFormat(PixelFormat.RGBA_8888); 
     holder.addCallback(this); 
    } 

    @SuppressLint("NewApi") 
    public void init(...) { 
     parseServerInfo(receivedData); 
     prVideoDisplayHandler.removeCallbacks(prDisplayVideoTask); 
     prVideoDisplayHandler.postDelayed(prDisplayVideoTask, prDelay); 
    } 

    public void pause(){ 
     naPause(); 
     prVideoDisplayHandler.removeCallbacks(prDisplayVideoTask); 
    } 

    public void resume(){ 
     prVideoDisplayHandler.postDelayed(prDisplayVideoTask, prDelay); 
    } 

    public void parseServerInfo(String data) { 
     if (numCameras == 0) { 
      Toast.makeText(mContext, "No stream detected!", Toast.LENGTH_LONG).show(); 

      // Finish is called here 
      VideoPlayer videoplayer = (VideoPlayer) mContext; 
      videoplayer.finish(); 
      return; 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     if (mCreated == true) { 
      surfaceDestroyed(holder); 
     } 
     Surface surface = holder.getSurface(); 
     render(surface); 
     mCreated = true; 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     mCreated = false; 
    } 
} 

Надежда кто-то может помочь указать, что я делаю неправильно.

+0

Я тоже начинаю. Вместо этого попробуйте getActivity(), потому что вы хотите завершить активность. –

+0

@UmeshChhabra Если я не ошибаюсь, его нельзя вызвать getActivity() из SurfaceView. Поэтому я использовал getContext(), чтобы получить ссылку на Activity. – miazima

+0

getContext.getActivity(); –

ответ

1

Вот почему он продолжается и замерзает (как упоминалось в комментариях к вашему вопросу). Должно. Так работает Java-язык. Здесь

@SuppressLint("NewApi") 
public void init(...) { 
    parseServerInfo(receivedData); 
    ... 
} 

Вы называете parseServerInfo(receivedData); который делает

public void parseServerInfo(String data) { 
    if (numCameras == 0) { 
     Toast.makeText(mContext, "No stream detected!", Toast.LENGTH_LONG).show(); 

     // Finish is called here 
     VideoPlayer videoplayer = (VideoPlayer)getContext(); 
     videoplayer.finish(); 
     return; 
    } 
} 

Таким образом, вы видите Тост, получение отделка под названием, и говорить хорошо идти. Но вы не смотрите назад, откуда вы пришли. С комментариями, что ваш метод инициализации должен сказать

@SuppressLint("NewApi") 
public void init(...) { 
    // make a call to check that the number of cameras is not 0 
    parseServerInfo(receivedData);  
    // AND CONTINUE NO MATTER WHAT... 
    prVideoDisplayHandler.removeCallbacks(prDisplayVideoTask); 
    prVideoDisplayHandler.postDelayed(prDisplayVideoTask, prDelay); 
} 

Что вам нужно

public boolean parseServerInfo(String data) { 
    if (numCameras == 0) { 
     Toast.makeText(mContext, "No stream detected!", Toast.LENGTH_LONG).show(); 

     // Finish is called here... AND FALSE IS RETURNED 
     VideoPlayer videoplayer = (VideoPlayer) mContext; 
     videoplayer.finish(); 
     return false; 
    } 
    return true; 
} 

затем

@SuppressLint("NewApi") 
public void init(...) { 
    // make a call to check that the number of cameras is not 0 
    // AND CONTINUE IF GOOD (TRUE) 
    if(parseServerInfo(receivedData)){ 
     prVideoDisplayHandler.removeCallbacks(prDisplayVideoTask); 
     prVideoDisplayHandler.postDelayed(prDisplayVideoTask, prDelay); 
    } 
} 

это будет анализировать данные, закончить свою деятельность, если она должна, и затем прекратите выполнение с помощью метода SurfaceView init. Извините за столь избыточный код, но это проще всего объяснить: P

+0

Изменение структуры кода, такого как вы предлагали! Спасибо! – miazima

0

Вам необходимо обратиться к Управлению, которое вы хотели бы закончить в SurfaceView. Вы получаете контекст от конструктора класса SurfaceView. Используйте это, чтобы finish() вашей деятельности, как и

//class member 
private Context mContext; 

public RenderView(...) { 
    super(_context); 

    //make the context accessible from the whole class 
    this.mContext = _context; 

    ... 
} 

Наконец вы звоните finish() на этот контекст, чтобы закончить свою VideoPlayer деятельности.

+0

Я попробовал ваше предложение, но я все еще сталкиваюсь с той же проблемой. – miazima

+0

Передаете ли вы контекст активности в конструктор RenderView? @miazima – Marcus

+0

Да @Marcus, я обновил свой код – miazima