【问题标题】:How to start an activity from a non-ui thread (from a surface view drawing thread)如何从非 ui 线程启动活动(从表面视图绘图线程)
【发布时间】:2012-03-10 07:19:39
【问题描述】:

我正在开发一个使用表面视图来表示 ui 图形的 android 游戏。如果用户触摸特定区域,我需要实现一种方法来启动另一个活动。 为此,我将主(前台)活动的当前实例传递给表面视图

我可以轻松处理触摸,但无法从接收到的实例启动活动。

**> 如果我从接收到的实例调用 startActivity 方法

当前活动发生异常,表明它是来自非 ui线程**

我正在使用一个扩展至表面视图的类并传递给在其画布上绘制的线程

【问题讨论】:

  • 谢谢各位,我想通了,我从类实例中调用了 runOnUI,它运行良好

标签: java android android-activity thread-safety


【解决方案1】:

SurfaceView 是否在活动中? 如果是这样,请使用

runOnUiThread(new Runnable() {
  public void run() {
    //startActivity
  }
});

如果你不在一个活动中,你真的不应该开始其他活动..

SurfaceView 还有一个 post 和 postDelayed 方法,可用于在 UI 线程上发布 Runnables。

  post(new Runnable() {
       public void run() {
         //startActivity
       }

   });

【讨论】:

  • 在我的应用程序中,一个表面视图对象在活动中被实例化,然后该对象被传递给活动的 setContentView() 方法
  • 我会争辩说,如果它不是直接在一个活动中,它不应该开始其他活动。它应该将它委托给使用它的活动。我会实现一些接口来响应来自surfaceview的一些事件(回调函数)。不过,我将不得不查看您的更多代码来帮助您。
【解决方案2】:

我认为你可以这样做......

 runOnUiThread(new Runnable() {
                     public void run() {


           // start your activity here


                    }
                });

【讨论】:

    【解决方案3】:

    你可以使用:

    // from MySurfaceView/Activity
    Context context = getContext(); 
    
    //EffectingActivity is another activity
    Intent intent = new Intent(context, EffectingActivity.class); 
    context.startActivity(intent);
    

    【讨论】:

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