【问题标题】:OnResume not called while dealing with surface view处理表面视图时未调用 OnResume
【发布时间】:2013-08-13 05:22:38
【问题描述】:

我的应用程序有一个将视图设置为 SurfaceView 的 mainActivity。

应用程序已启动并正确显示。 我按下主页按钮。-> onPause 调用,Surfaceview 被破坏并且线程被正确杀死。 现在,当我再次单击我的应用程序时,未调用 OnResume 并且我看不到任何事情发生,事实上手机卡住了。

每当我有一个新的表面时,我都会创建一个新线程。

我不确定为什么这段代码有问题,但我主要怀疑 SurfaceView 中处理不当。?

请帮忙!!

@Override
public void surfaceCreated(SurfaceHolder arg0) {
    // TODO Auto-generated method stub
    BounceLogger.logIt(this, "surfaceCreated");
    graphThread=new GraphUpdaterThread(mSurfaceHolder);
    graphThread.runThread();

}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
    // TODO Auto-generated method stub
    BounceLogger.logIt(this, "surfaceDestroyed");
    graphThread.stopThread();
    graphThread= null;
}






@Override
    public void onPause()
    {
        super.onPause();
        //handleProcessPaused();
        //mGsv.getThread().pauseThread();

        BounceLogger.logIt(this,"onPause()");        
    }

    @Override
    public void onResume()
    {
        super.onResume();
        //mGsv.getThread().resumeThread();
        //init();
        BounceLogger.logIt(this,"onResume()");      
    }

【问题讨论】:

  • 你试过调用surfaceChanged()吗?当大小改变或首次创建时调用该方法。

标签: android surfaceview onresume


【解决方案1】:

你能发布这个的 adb logcat 吗?错误可能在 onCreate() 中。

当 onPause() 被调用时,它会调用 surfaceDestoryed(),然后可以调用 onDestroy()。

当你重新打开你的应用程序时,它可能会再次调用 onCreate() 并且那时可能会发生错误,这就是为什么永远不会调用 onResume() 的原因。

没有 logcat 很难调试。

【讨论】:

  • 我的应用程序没有调用 onResume,但会显示 UI,但如果我按下返回按钮,我的应用程序就会卡住。
  • 从技术上讲,直到 onPause 之后和 onStop 之前,表面才会被破坏。这是一些模糊的区域。
【解决方案2】:

经过一番挣扎后,我发布了我的代码出了什么问题。

基本上在 surfaceDestroyed 我调用 stopThread 来执行阻塞调用 currentThread.Join() 所以我的 MainThread 被阻塞并且没有响应任何东西。

public void surfaceDestroyed(SurfaceHolder arg0) {
    // TODO Auto-generated method stub
    BounceLogger.logIt(this, "surfaceDestroyed");
    graphThread.stopThread();                  
    graphThread= null;
}

我的线程实现

 public void run()
      {

          BounceLogger.logIt(this, "run start!!");
          while(!stop)
          {
              while(run)
              {
                updateThread(); 
              }
              if(!stop)
                  waitThread();
          }
          BounceLogger.logIt(this, "run end!!");
          return;
      } 

 public synchronized void stopThread()
  {
        run = false;     
        stop= true;
        boolean retry = true;
           while(retry)
           {
             try{
                Thread.currentThread.join();
                retry= false;
                }
             catch(Exception e)
             {
              } 
           }    
  }

我刚刚在我的 stopThread 函数中删除了 join() 一切正常!!。

注意:我通过设置标志停止我的线程,每次运行并创建一个新线程!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多