接触android的开发半年多了,针对一些问题或者是经验做一些总结记录,以供以后翻阅学习。
android程序开始运行的时候,会单独启动一个process,在默认的情况下,所有的这个程序中的activity和service(activity和service只是android提供的components中的两种,除此之外还有content provide 和broadcast recevier)都会泡在这个process。
一个android的程序默认情况下也只有一个process,但是一个process可以有许多个thread。UI Thread在android程序运行的时候就被创建,是一个Process当中的主线程Main Thread,主要负责控制UI界面的显示、更新和控件的交互。
首先注意两点:
1、android的主线程中不能直接访问网络,UI线程也就是主线程中不能有比较费时的操作,如访问网络,下载数据,查询数据库等,以免阻塞主线程。
2、android的子线程不成直接操作UI,子线程更新ui的是不安全的,多个子线程同时操作一个控件可能发生麻烦,所以android中禁止子线程去更新UI操作,只有主线程才能去更新UI。
Handler就是连接子线程和主线程的桥梁,我们可以在主线程中创建一个子线程来访问网络,子线程访问的结果返回到主线程中来做UI 更新。
直接实现方式:
1、主线程中新建一个子类继承Handler,并重写handleMessage(Message msg)方法实现监听来修改UI等主线程操作
2、主线程中创建一个Thread线程,并将上面的handler实例作为参数传入,
3、在子线程的run方法中待其他操作都完成后调用handler的handleMessage()或者handleEmptyMessage()方法调用主线程的监听。
一些耗时的操作都在子线程的run方法中执行。
主要代码如下:
<span style="white-space:pre"> </span>@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ubunta_btn:
MyThread thread = new MyThread(new MyHandler());
thread.start();
break;
}
}
class MyHandler extends Handler {
public void handleMessage(Message msg) {
switch(msg.what) {
case 10 :
text.setText("点击修改");
Toast.makeText(getApplicationContext(), "sdsdsd", Toast.LENGTH_LONG).show();
break;
}
}
}
class MyThread extends Thread {
private Handler handler;
public MyThread(Handler handler) {
this.handler = handler;
}
@Override
public void run() {
handler.sendEmptyMessage(10);
}
}
说明:还有一种做法是activity'直接实现android.os.Handler.Callback接口,直接在activity中重写handleMessage即可实现主线程的监听。
android中还提供了一个抽象类AsyncTask来实现异步的网络访问和UI更新操作,这里没做太多了解。
至于Http请求,android主要使用HttpURLConnection和Apache的HttpClient来访问网络,分get和post 方法
针对http请求可以封装成指定的工具类,以便项目搬运和公用,
实现思路主要是将请求地址url和参数map作为参数,将得到的结果以json形式返回,或者转成指定的java对象即可。