Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android UI线程和Surfaceview_Android_Multithreading_User Interface - Fatal编程技术网

Android UI线程和Surfaceview

Android UI线程和Surfaceview,android,multithreading,user-interface,Android,Multithreading,User Interface,我对安卓非常陌生。我在android开发者网站上看到了关于android线程的两条规则: 1 : Do not block the UI thread 2 : Do not access the Android UI toolkit from outside the UI thread 如果您查看android sdk的LunarLander示例,可以看到以下代码: class LunarView extends SurfaceView implements SurfaceHolder.Cal

我对安卓非常陌生。我在android开发者网站上看到了关于android线程的两条规则:

1 : Do not block the UI thread
2 : Do not access the Android UI toolkit from outside the UI thread
如果您查看android sdk的LunarLander示例,可以看到以下代码:

class LunarView extends SurfaceView implements SurfaceHolder.Callback {

//...

public LunarView(Context context, AttributeSet attrs) {

      class LunarThread extends Thread {

         //...

         private void doDraw(Canvas canvas) {
                //do some drawing on the canvas
         }
      }

      //...

    public LunarView(Context context, AttributeSet attrs) {
        super(context, attrs);

        // ...

        // create thread only; it's started in surfaceCreated()
        thread = new LunarThread(holder, context, new Handler() {
            @Override
            public void handleMessage(Message m) {
                mStatusText.setVisibility(m.getData().getInt("viz"));
                mStatusText.setText(m.getData().getString("text"));
            }
        });

        //...

     }


     //...

  }
如您所见,我们正在创建一个新线程,该线程正在渲染视图

为什么这段代码没有违反android框架线程的第二条规则


感谢阅读。

线程没有呈现视图。我不完全确定它是如何工作的,但它使用处理程序向拥有视图的线程发送消息。LunarLander以与此示例相同的方式管理线程:

我以前从未尝试过此代码。但我猜
handleMessage(messagem)
是在主(UI)线程中执行的。为了验证它,您可以添加一些代码进行检查

thread = new LunarThread(holder, context, new Handler() {
            @Override
            public void handleMessage(Message m) {
                if (Thread.currentThread().getId() == 1) {
                    // main thread
                }
                else {
                    // other thread
                }
                mStatusText.setVisibility(m.getData().getInt("viz"));
                mStatusText.setText(m.getData().getString("text"));
            }
        });

您可以在另一个线程中渲染。这就是示例的全部要点:创建第二个线程,该线程将写入画布,然后将画布传输到MainUI。