handlerとrunOnMainThread更新インタフェースの問題

2356 ワード

Androidインタフェースの更新はメインスレッドでのみ行われることはよく知られています.しかし、私はどうしてもサブスレッドでインタフェースを更新しなければなりません.どうすればいいですか.
友人が出会った質問では、javaのバックグラウンドを学んでいたが、突然Androidに興味を持ち、スレッド更新インタフェースについて質問した.
私が今スレッドを使ってインタフェースを更新する方法は2つあります.1つはhandlerです.もう1つはrunOnMainThreadですが、handlerは非常に速い更新とはよくありません.スレッドが遅れやすいです.つまり、この方法は非常に頻繁ではない更新でしか適用できません.
handler更新インタフェースはまた、2つの方法に従って更新することができる:MessageとRunable、Messageを使用してサブスレッドからいくつかのパラメータをプライマリスレッドに伝達することができ、Handlerはこれらの情報を取得し、対応する処理を行う.Runnableを使用すると、処理結果を直接実行できます.実際,両者の本質はいずれもHandlerのキューにコンテンツを入れることであり,Handlerは1つのメッセージを処理したり,ある処理を実行した後に次の操作を行うことで,複数のスレッドが同時にUI処理を要求して混乱を招くことはない.
具体的なコードは以下の通りです.
package com.example.androidui;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView mText;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		new Thread(mRunnable).start();
		mText = (TextView) findViewById(R.id.text);
	}

	private Runnable mRunnable = new Runnable() {
		public void run() {
			while (true) {
				try {
					Thread.sleep(1000);
					mHandler.sendMessage(mHandler.obtainMessage());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	};

	private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			update();
		}

		private void update() {
			mText.setText("    ——handler");
		}
	};

}
、runOnMainThread更新インタフェースは非常に簡単で、コードは以下の通りです.
package com.example.androidui;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private TextView mText;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mText = (TextView) findViewById(R.id.text);
		
		MainActivity.this.runOnUiThread(new Runnable()    
	    {    
	        public void run()    
	        {    
	            mText.setText("    -runOnUiThread") ; 
	        }    

	    });
	}
}