多线程是开发客户端程序的重要概念,无论你是PC,Mobile,还是Tablet。因为UI线程和通讯线程,操作线程都会交织在一起,如果处理不好会让你的程序非常的不好,损耗资源,费尽资源的情况都是因为线程没有处理好,下面我们来看看Android的线程是如何处理的
1:Handler
先看这个错误
Only the original thread that created a view hierarchy can touch its views,意思是只有原始线程创建了一个视图层次能改变界面,就是说你起了一个新线程只能用来传输数据,不能在新线程里改变ui状态。那到底怎么使用呢。Android里处理通信有Handler和Looper,AsyncTask,还有Service这个是用于全局通信的,各有各的应用场景据说Handler的效率是最高的,到底是不是,这个需要有一定的数据支撑。下面我们看看Handler的处理Http通信的线程的处理逻辑:
final Handler myHandler = new Handler();
final Runnable updateUIThead = new Runnable() {
public void run() {
updateUI();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
NetworkOperation();
}
//网络操作一定要单独的线程来处理
protected void NetworkOperation() {
Thread t = new Thread() {
public void run() {
doSomething(); //处理得到结果了,这里一些内容保存在主类的成员变量中
myHandler.post(updateUIThead); //高速UI线程可以更新结果了
}
};
t.start();
}
private void updateUI() {
}
通过上面的代码,很清晰的myHander.post把更新ui的线程放入到了handler中,在updateUI中就可以调用本Activity的UI元素进行UI设置,如果你不这样操作,对不起会出现Only the original thread that created a view hierarchy can touch its views的提示。注意android概念中的耗时操作,只要是耗时那就是new thread。
2:AsyncTask
AsyncTask,这个网上的资料很多不具体详细讲了,主要实现doInBackgroud去联网获得JSONObject,在onPostExecute(JSONObject result)自然就会获得这个值不过需要
super.onPostExecute(result)
其实很简单,就是Android底层已经封装好了通道,只需要扩展他,并且分别实现响应的按他的要求方法,你就驾驭了AsyncTask
3:Service
Service只是后台运行的线程,不能用来做耗时操作,主要是用来做一些socket长链接,播放音乐,监听某个事件,启动一个服务等等,跟AsyncTask一样 extends Service你将会拥有固定的需要实现的方法,去实现他吧,不要犹豫,搞清楚每个方法体的功能,实现后你就获得了他的功能,看看他的生命周期:
context.startService() ->onCreate()- >onStart()->Service running--调用context.stopService() ->onDestroy()
context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()
综合以上,再回过头来看看其实Android的线程通信也不难吧,不过细节的地方还有很多需要学习和了解,查阅资料,我们伟大的互联网上有很多伟大的网友提供了很多,只要想去知道,总有能明白的