2

我对android很陌生。我在 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 框架线程的第二条规则?

谢谢阅读。

4

2 回答 2

0

该线程未呈现视图。我不完全确定它是如何工作的,但它使用处理程序将消息发送到拥有视图的线程。LunarLander 管理线程的方式与此示例相同:https ://developer.android.com/training/multiple-threads/communicate-ui.html

于 2013-08-08T10:49:41.133 回答
0

我以前从未尝试过此代码。但我猜handleMessage(Message m)是在主(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"));
            }
        });
于 2013-08-08T11:51:19.000 回答