Aandroid 总结4种线程中操作UI界面的方法

总结4种线程中操作UI界面的方法
 
我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据。但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的。下面总结4中方法用来在线程中操作UI界面。
 
  1 package com.chensw.uvinthread;

  2  

  3 import android.annotation.SuppressLint;

  4 import android.app.Activity;

  5 import android.app.ProgressDialog;

  6 import android.os.AsyncTask;

  7 import android.os.Bundle;

  8 import android.os.ConditionVariable;

  9 import android.os.Handler;

 10 import android.os.Message;

 11 import android.view.Menu;

 12 import android.view.View;

 13 import android.widget.Button;

 14 import android.widget.TextView;

 15  

 16 public class MainActivity extends Activity {

 17 private TextView textView = null;

 18 private TextView textView1 = null;

 19 private TextView textView2 = null;

 20 private TextView textView3 = null;

 21 private Handler handler = null;

 22  

 23 private Handler showHandler = null;

 24 private Button myBtn = null;

 25 private ProgressDialog progressDialog = null;

 26 private static final int DISMISS_PROGRESS_DIALOG = 1;

 27 private Message message = null;

 28 private ConditionVariable mCondition;

 29  

 30 @Override

 31 protected void onCreate(Bundle savedInstanceState) {

 32 super.onCreate(savedInstanceState);

 33 setContentView(R.layout.activity_main);

 34  

 35 textView = (TextView) findViewById(R.id.textView);

 36 textView1 = (TextView) findViewById(R.id.textView1);

 37 textView2 = (TextView) findViewById(R.id.textView2);

 38 textView3 = (TextView) findViewById(R.id.textView3);

 39 myBtn = (Button) findViewById(R.id.button1);

 40  

 41 // 方法一,使用handler进行修改

 42 // 实例化内部类Handler

 43 handler = new MyHandler();

 44 // 启动新线程,在线程中调用handler的方法

 45 new Thread() {

 46 public void run() {

 47 // 可以使用Message类实例进行参数传递

 48 handler.handleMessage(null);

 49 }

 50 }.start();

 51  

 52 // 方法二,使用View.post(Runnable)方法修改-----注意:方法二不能与方法三,方法四并存在同一UI线程中

 53 new Thread(new ViewRunnable()).start();

 54  

 55 // 方法三,使用Activity.runOnUiThread(Runnable);

 56 new Thread(new UIThead()).start();

 57  

 58 // 方法四,使用AsyncTask

 59 new UIAsyncTask().execute(null, null);

 60  

 61 // 一个显示ProgressDialog的简单例子

 62 showHandler = new ShowHandler();

 63 mCondition = new ConditionVariable();

 64 myBtn.setOnClickListener(new ShowButtonListener());

 65  

 66 }

 67  

 68 // 编写按钮监听类

 69 private class ShowButtonListener implements View.OnClickListener {

 70 @Override

 71 public void onClick(View arg0) {

 72 progressDialog = ProgressDialog.show(MainActivity.this, "请稍等...",

 73 "加载中...", true);

 74 new Thread() {

 75 @Override

 76 public void run() {

 77 // 线程阻塞的两种方法

 78 try {

 79 Thread.sleep(2000);

 80 } catch (InterruptedException e) {

 81 e.printStackTrace();

 82 }

 83  

 84 //mCondition.block(5000);

 85  

 86 message = showHandler

 87 .obtainMessage(DISMISS_PROGRESS_DIALOG);

 88 showHandler.sendMessage(message);

 89 }

 90 }.start();

 91 }

 92 }

 93  

 94 /*

 95 * 在Handler中停止ProgressDialog

 96 */

 97 @SuppressLint("HandlerLeak")

 98 private class ShowHandler extends Handler {

 99 @Override

100 public void handleMessage(Message msg) {

101 switch (msg.what) {

102 case DISMISS_PROGRESS_DIALOG:

103 progressDialog.dismiss();

104 break;

105 default:

106 break;

107 }

108 }

109 };

110  

111 // 方法四,使用AsyncTask

112 private class UIAsyncTask extends AsyncTask<Void, Void, String> {

113 @Override

114 protected String doInBackground(Void... params) {

115 return "UIAsyncTask";

116 }

117  

118 @Override

119 protected void onPostExecute(String result) {

120 textView3.setText(result);

121 }

122  

123 }

124  

125 /*

126 * 方法三,使用Activity.runOnUiThread(Runnable);

127 */

128 private class UIThead implements Runnable {

129 @Override

130 public void run() {

131 runOnUiThread(new Runnable() {

132 public void run() {

133 textView2.setText("UIThead");

134 }

135 });

136 }

137 }

138  

139 /*

140 * 方法二,使用View.post(Runnable)方法修改; 编写内部类实现Runnable接口,在内部类中修改UI

141 */

142 private class ViewRunnable implements Runnable {

143 @Override

144 public void run() {

145 // 在线程中调用子线程修改UI,子线程的调用使用View.post(Runnable)

146 textView1.post(new Runnable() {

147 @Override

148 public void run() {

149 textView1.setText("MyRunnable");

150 }

151 });

152 }

153 }

154  

155 /*

156 * 方法一,使用handler进行修改; 编写内部类继承Handler类,在内部类中修改UI

157 */

158  

159 @SuppressLint("HandlerLeak")

160 private class MyHandler extends Handler {

161 @Override

162 public void handleMessage(Message msg) {

163 textView.setText("MyHandler");

164 }

165 };

166  

167 @Override

168 public boolean onCreateOptionsMenu(Menu menu) {

169 // Inflate the menu; this adds items to the action bar if it is present.

170 getMenuInflater().inflate(R.menu.main, menu);

171 return true;

172 }

173  

174 }

175  

 

你可能感兴趣的:(android)