轉自:http://blog.csdn.net/keyboard_workers/article/details/7620566
首先runOnUiThread是Activity內部的方法,在運用的時候最好指明當前環境變(Context).
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getId());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(RunOnUIThreadActivity.this, "UI操作...", 1000).show();
}
});
}
}).start();
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
new Thread(new Runnable() {
@Override
public void run() {
if(isClose)
return;
if(i!=0)
Toast.makeText(RunOnUIThreadActivity.this, i+"", 1000).show();
i++;
handler.postDelayed(this, 2000);
}
}).start();
}
上面兩個其實原理一樣,runOnUiThread這個會調用父類中的
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
首先判斷是否是UI線程,不是的話就post,如果是的話就正常運行該線程.
只要經過主線程中的Handler.post或者postDelayed處理線程runnable則都可以將其轉為UI主線程.再說Handler的機制就是來處理線程與UI通訊的.
三、Android多線程與介面互動的辦法
1.Activity.runOnUIThread(Runnable)
2.View.post(Runnable),View.postDelay(Runnable,long)
3、Handler
4、AsyncTask
下面用一個工程實現了上方四種互動辦法
public class MainActivity extends Activity {
private TextView txView;
private Button button;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i("RootyInfo", "oncreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txView=(TextView)findViewById(R.id.textView1);
button=(Button)findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//建立一個用於顯現前三種後台線程和UI線程互動的線程
new TestThread(MainActivity.this).start();
//建立一個用於顯現AsyncTask實現互動的TestAsyncTask
new TestAsyncTask().execute("Test"," AsyncTask");
}
});
}
class TestAsyncTask extends AsyncTask<String, Integer, String>
{
//TestAsyncTask被後台線程履行後,被UI線程被調用,一般用於初始化介面控制項,如進度條
@Override
protected void onPreute() {
// TODO Auto-generated method stub
super.onPreute();
}
//doInBackground履行完後由UI線程調用,用於更新介面操縱
@Override
protected void onPostute(String result) {
// TODO Auto-generated method stub
txView.setText(result);
super.onPostute(result);
}
//在PreExcute履行後被啟動AysncTask的後台線程調用,將成果返回給UI線程
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
StringBuffer sb=new StringBuffer();
for (String string : params) {
sb.append(string);
}
return sb.toString();
}
}
//用於線程間通訊的Handler
class TestHandler extends Handler
{
public TestHandler(Looper looper) {
super(looper);
// TODO Auto-generated constructor stub
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
System.out.println("123");
txView.setText((String)msg.getData().get("tag"));
super.handleMessage(msg);
}
}
//後台線程類
class TestThread extends Thread
{
Activity activity;
public TestThread(Activity activity) {
this.activity = activity;
}
@Override
public void run() {
//下面代碼用來示範Activity.runOnUIThread(Runnable)辦法的實現
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
txView.setText("Test runOnUIThread");
}
});
//下面代碼用來示範Activity.runOnUIThread(Runnable)辦法的實現
txView.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
txView.setText("Test View.post(Runnable)");
}
});
//下面代碼用來示範Activity.runOnUIThread(Runnable)辦法的實現
txView.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
txView.setText("Test View.postDelay(Runnable,long)");
}
}, 1000);
//下面代碼用來示範Handler辦法的實現
Message msg=new Message();
Bundle bundle=new Bundle();
bundle.putString("tag", "Test Handler");
msg.setData(bundle);
new TestHandler(Looper.getMainLooper()).sendMessage(msg);
super.run();
}
}
}