AndroidUI——后台线程更新UI的几种方式
2016-04-12 12:20
519 查看
开发Android程序时经常会用到后台线程请求服务器数据,当请求完数据后更新UI时,经常遇到回调函数中和UI相关的语句无法执行,甚至有时候会抛异常。
下面的例子我会讲到三种方法更新UI,例子非常简单,一个Activity和一个后台线程,在Activity中启动后台线程并把自己作为参数传给后台线程,后台线程每隔4秒调用Activity的showToast()方法一次,在showToast()方法中显示Toast。
MainActivity.java
MyThread.java
需要注意的是:方法一和方法二Handler的初始化必须在主线程中,否则会抛异常,方法三的Handler可以不在主线程中初始化
下面的例子我会讲到三种方法更新UI,例子非常简单,一个Activity和一个后台线程,在Activity中启动后台线程并把自己作为参数传给后台线程,后台线程每隔4秒调用Activity的showToast()方法一次,在showToast()方法中显示Toast。
MainActivity.java
package com.windanran.testtoast; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Process; import android.widget.Toast; import android.annotation.SuppressLint; import android.app.Activity; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new MyThread(this).start(); } /*****************************方法一**********************************/ @SuppressLint("HandlerLeak") /*private Handler handler1 = new Handler() { @Override public void handleMessage(Message msg) { Toast.makeText(MainActivity.this, "Toast is show!", Toast.LENGTH_SHORT).show(); super.handleMessage(msg); } }; public void showToast() { handler1.sendEmptyMessage(0); }*/ /*****************************方法一**********************************/ /*****************************方法二**********************************/ /*private Handler handler2 = new Handler(); public void showToast() { handler2.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "Toast is show!", Toast.LENGTH_SHORT).show(); } }); }*/ /*****************************方法二**********************************/ /*****************************方法三**********************************/ public void showToast() { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "Toast is show!", Toast.LENGTH_SHORT).show(); } }); } /*****************************方法三**********************************/ @Override public void onBackPressed() { Process.killProcess(Process.myPid()); super.onBackPressed(); } }
MyThread.java
package com.windanran.testtoast; public class MyThread extends Thread{ private MainActivity activity = null; private boolean b = true; public MyThread(MainActivity activity) { this.activity = activity; } @Override public void run() { while(b) { try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } activity.showToast(); } super.run(); } }
需要注意的是:方法一和方法二Handler的初始化必须在主线程中,否则会抛异常,方法三的Handler可以不在主线程中初始化
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories