进程Process
默认情况下,一个应用程序的所有组件都在一个进程之中.
但也可以通过Manifest.xml文件中的android:process来指定某个<activity><service><provider><receiver>控件属于哪个进程,也可以为<application>指定进程
通过android:process可以让同一个应用的组件运行在不同的进程中,也可以使不同应用的组件运行在一个进程中
在系统内存较低的时候,Android系统会按一定规律选择性关闭一些进程.
线程Thread
不要阻塞UI线程(main线程)
不要从UI线程之外的线程来操纵UI,比如imgView.setImageBitmap(...)等
从别的线程来更改UI时,可以用Activity.runOnUiThread(Runnable),View.post(Runnable),View.postDelayed(Runnable,long)
public void onClick(View v) { new Thread(new Runnable() { public void run() { final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png"); mImageView.post(new Runnable() { public void run() { mImageView.setImageBitmap(bitmap); } }); } }).start(); }但遇到更加复杂的情形时会很乱,应该使用一个Handler或者继承AsyncTask类,
AsyncTask异步任务类
继承AsyncTask类时,不用自己去管理线程,onPreExcute是在调用前执行的块,onProgressUpdate,onPostExcute都是在原来的线程中进行的操作
doInBackground是在新的线程中的操作,其返回值返回给了onPostExcute方法
任何时候都可以在doInBackground中使用publishProcess()方法来执行onProgressUpdate.
任何时候都可以取消新线程.
public void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png"); } private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { /** The system calls this to perform work in a worker thread and * delivers it the parameters given to AsyncTask.execute() */ protected Bitmap doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); } /** The system calls this to perform work in the UI thread and delivers * the result from doInBackground() */ protected void onPostExecute(Bitmap result) { mImageView.setImageBitmap(result); } }
Handler
//下面这个是可以处理消息的Handler
Handler handler=new Handler(){
public void handleMessage(Message msg){
System.out.println(msg.arg1+"");
}
}
handler.post(updateThread); //把新线程加入到消息队列中
Runnable updateThread=new Runnable(){
public void run(){
Message msg=handler.obtainMessage(); //获得handler中消息队列的一个消息
msg.arg1=50; //为msg携带的值赋值
handler.sendMessage(msg); //把消息加入handler的消息队列
}
}
但是上述两个Handler其实都没有真正的启动另外的线程,而还是在原来的main线程中执行!!!!
如果要使用Handler来生成新线程来执行复杂操作可以使用HandlerThread类,
HandlerThread类会启动一个带有looper的新的线程,而这个looper一会儿可以用来创建Handler
HandlerThread handlerThread=new HandlerThread("handler_thread"); //创建一个HandlerThread线程对象,如果要执行有意义的操作,继承这个类,重写run方法
handlerThread.start();
MyHandler myHandler=new MyHandler(handlerThread.getLooper()); //用新线程的looper来创建一个handler对象
Message msg=myHandler.obtainMessage();
msg.sendToTarget();
class MyHandler extends Handler{
public void handleMessage(Message msg){
}
}