Android线程间通信

Handler和runOnUiThread

  • Handler
  • runOnUiThread

在非主UI线程更新视图,常用这两种方法。
对于第一种方法,是采用传递消息的方式,调用Handler中方法来处理消息更新视图。这种方式对于不是很频繁的调用是可取的。如果更新的较快,则消息处理会一直排队处理,这样显示会相对滞后。这个时候就可以考虑使用第二中方式,将需要执行的代码放到Runnable的run方法中,然后调用runOnUiThread()这个方法将Runnable的对象传入即可。

Handler

Android线程间通信_第1张图片子类需要继承Handler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据

以下示例,实现了两个计数功能:

public class MainActivity extends Activity {
         
    private TextView mTextView1,mTextView2;   
    //“信使”
    private Handler mHandler = new Handler() {
     
        
        //覆盖此方法,此方法用于接收发来的消息
        public void handleMessage(android.os.Message msg) {
     
            //处理子线程发送来的消息
            switch (msg.what) {
     
            case 1:
                //取出信息中的内容
                String text1 = (String) msg.obj;
                //主线程执行UI操作,设置到UI上
                mTextView1.setText(text1);
                break;
            case 2:
              //取出信息中的内容
                String text2 = (String) msg.obj;
                //主线程执行UI操作,设置到UI上
                mTextView2.setText(text2);
                break;
            }            
        }       
    };  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
     
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mTextView1 = (TextView) findViewById(R.id.text1);
        mTextView2 = (TextView) findViewById(R.id.text2);
        
        //启动一个子线程
        new Thread() {
               
            public void run() {
     
                for(int i=0;i<10;i++) {
     
                    try {
     
                        sleep(1000);
                    } catch (InterruptedException e) {
     
                        e.printStackTrace();
                    }
                    //发送消息数据给主线程
                    Message message = Message.obtain(); //尽量可以重用对象
                    //使用一个int值来区分消息类型
                    message.what = 1;
                    //设置消息内容
                    message.obj = "计次:"+i;
                    //使用Handler对象发送消息
                    mHandler.sendMessage(message);
                }
            }
        }.start();
        
      //启动一个子线程
        new Thread() {
        
            public void run() {
     
                for(int i=0;i<20;i++) {
     
                    try {
     
                        sleep(500);
                    } catch (InterruptedException e) {
     
                        e.printStackTrace();
                    }
                    //发送消息数据给主线程
                    Message message = Message.obtain(); //尽量可以重用对象
                    //使用一个int值来区分消息类型
                    message.what = 2;
                    //设置消息内容
                    message.obj = "计次:"+i;
                    //使用Handler对象发送消息
                    mHandler.sendMessage(message);
                }
            }
        }.start();
    }   
}

runOnUiThread

利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程

public class MainActivity extends Activity {
     
    private TextView mTextView1, mTextView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
     
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView1 = (TextView) findViewById(R.id.text1);
        mTextView2 = (TextView) findViewById(R.id.text2);
        // 启动一个子线程
        new Thread() {
     
            public void run() {
     
                for (int i = 0; i < 10; i++) {
     
                    try {
     
                        sleep(1000);
                    } catch (InterruptedException e) {
     
                        e.printStackTrace();
                    }
                    // 创建一个专门用于赋值的变量
                    final int count = i;
                    // 切换到主线程中执行
                    runOnUiThread(new Runnable() {
     

                        @Override
                        public void run() {
     
                            mTextView1.setText("计数:" + count);
                        }
                    });
                }
            }
        }.start();

        // 启动一个子线程
        new Thread() {
     
            public void run() {
     
                for (int i = 0; i < 20; i++) {
     
                    try {
     
                        sleep(500);
                    } catch (InterruptedException e) {
     
                        e.printStackTrace();
                    }

                    // 创建一个专门用于赋值的变量
                    final int count = i;
                    // 切换到主线程中执行
                    runOnUiThread(new Runnable() {
     
                        @Override
                        public void run() {
     
                            mTextView2.setText("计数:" + count);
                        }
                    });
                }
            }
        }.start();
    }
}

你可能感兴趣的:(Android,android,多线程,java)