方式一: Handler 和 Message
实例化一个 Handler 并重写 handlerMessage() 方法
- private Handler handler = newHandler() {public void handleMessage(Message msg) {
- // 处理消息
- super.handleMessage(msg);
- switch (msg.what) {
- case 1:
- button1.setText("点击安装");
- break;
- case 2:
- button1.setText("打开");
- break;
- }
- };
- };
在子线程中获取或创建消息, 并使用 handler 对象发送
- Message msg = handler.obtainMessage();
- msg.what = 1;
- handler.sendMessage(msg);
方式二: 在子线程中直接调用 Activity.runOnUiThread(Runnable action) 方法
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- // 更新 UI 的操作
- }
- });
方式三: 在子线程中调用 View 的 post() 方法
- myTextView.post(new Runnable() {
- @Override
- public void run() {
- // 更新 UI
- myView.setText("更新 UI");
- }});
方式四: 在子线程中调用 View.PostDelayed(Runnabe,long)
方式五: Handler 的 post() 方法
创建一个 Handler 成员变量
private Handler handler = new Handler();
在子线程中调动 post() 方法
- handler.post(new Runnable() {
- @Override
- public void run() {
- // 更新 UI
- myView.setText("更新 UI");
- }});
方式六: AsyncTask
- private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>
- // 在这里声明了 Params,Progress,Result 参数的类型
- {
- // 因为这里不需要使用 onPreExecute 回调方法, 所以就没有加入该方法
- // 后台线程的目的是更具 URL 下载数据
- protected Long doInBackground(URL... urls) {
- int count = urls.length;//urls 是数组, 不止一个下载链接
- long totalSize = 0;// 下载的数据
- for (int i = 0; i < count; i++) {
- //Download 是用于下载的一个类, 和 AsyncTask 无关, 大家可以忽略他的实现
- totalSize += Downloader.downloadFile(urls[i]);
- publishProgress((int) ((i / (float) count) * ));// 更新下载的进度
- // Escape early if cancel() is called
- if (isCancelled()) break;
- }
- return totalSize;
- }
- // 更新下载进度
- protected void onProgressUpdate(Integer... progress) {
- setProgressPercent(progress[0]);
- }
- // 将下载的数据更新到 UI 线程
- protected void onPostExecute(Long result) {
- showDialog("Downloaded" + result + "bytes");
- }
- }
来源: https://www.cnblogs.com/kexing/p/9026960.html