进程&多线程
Android的四大组件都是运行在主线程当中的
进程的优先级 | 叙述 |
---|---|
前台进程(Foreground process) | 优先级最高, 得到焦点onResume(), 正在和用户交互 |
可视进程(Visible process) | 一直影响用户看得见 相当于onPause() |
服务进程(Service process) | 就是开启的服务 |
后台进程(Backfround process) | 界面不可见, 但还没销毁, 相当于onStop() |
空进程(Empty process) | 就是空闲的内存空间 |
只有主线程才能更新UI
在其它线程更新UI方法:
- Handler发消息和处理消息: (Handler发消息到MessageQueue(消息队列),Looper(消息循环监视器)监视MessageQueue,循环取出消息到Handler处理消息)
//发消息
handler.sendEmptyMessage(100); //简单的消息(编号100,只有编号)
Message msg = Message.obtain(); //创建消息
msg.what = 747; //消息编号
msg.obj = value; //携带数据value
handler.sendMessage(msg); //发送消息
//接收处理消息
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) { //接收消息
switch (msg.what) {
case 100:
break;
case 747:
String value = (String) msg.obj;
System.out.println("执行更新UI操作:"+value);
break;
default:
break;
}
}};
class MyThread extends Thread { @Override public void run() { lw(); //联网 }}
- 使用 runOnUiThread 直接在UI线程执行:
runOnUiThread(new Runnable() { //在UI线程里执行action (不管在哪里都可以调用)
@Override public void run() {
Toast.makeText(getApplicationContext(), "执行更新UI操作:"+value, 0);
}});
- View.post(Runnable)
多线程
java中创建线程有两种方法:
- 直接继承Thread类,重载它的run()方法;(编写简单,可以直接操作线程,一般适用于单重继承的情况)
class MyThread extends Thread{
@Override
public void run(){
/*新开线程要做的事~~*/
}
}
new MyThread().start(); //启动
/* 简单写法 new Thread(){ public void run(){System.out.println("新开线程..");};}.start();*/
- 实现Runnalbe接口,重载Runnalbe接口中的run()方法。(可以使多个子线程之间使用同一个Runnable对象,共享同一些资源,比如在类里定义一个int…)
public class MyRunnable implements Runnable{
public void run(){
System.out.println("新开线程..");
}
}
异步处理 AsyncTask
学习自:http://blog.youkuaiyun.com/wxg630815/article/details/7003812
AsyncTask(AAA, BBB, CCC)
参数 | 属性 |
---|---|
AAA | execute()方法时传入的参数类型和doInBackgound()的参数类型 |
BBB | publishProgress()和onProgressUpdate()的参数类型 |
CCC | doInBackground()的返回值类型 |
方法解析: | … |
---|---|
doInBackgound() | 这个方法是继承AsyncTask必须要实现的,运行于后台,耗时的操作可以在这里做 == Run() |
publishProgress() | 更新进度,用于给onProgressUpdate()传递进度参数 |
onProgressUpdate() | 在publishProgress()调用完被调用,更新进度 |
例子:
public class MyActivity extends Activity
{
private Button btn;
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.start_btn);
tv = (TextView) findViewById(R.id.content);
btn.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
update();
}
});
}
private void update(){
UpdateTextTask updateTextTask = new UpdateTextTask(this);
updateTextTask.execute();
}
class UpdateTextTask extends AsyncTask<Void,Integer,Integer>{
private Context context;
UpdateTextTask(Context context) {
this.context = context;
}
/**
* 运行在UI线程中,在调用doInBackground()之前执行
*/
@Override
protected void onPreExecute() {
Toast.makeText(context,"开始执行",Toast.LENGTH_SHORT).show();
}
/**
* 后台运行的方法,可以运行非UI线程,可以执行耗时的方法
*/
@Override
protected Integer doInBackground(Void... params) {
int i=0;
while(i<10){
i++;
publishProgress(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
return null;
}
/**
* 运行在ui线程中,在doInBackground()执行完毕后执行
*/
@Override
protected void onPostExecute(Integer integer) {
Toast.makeText(context,"执行完毕",Toast.LENGTH_SHORT).show();
}
/**
* 在publishProgress()被调用以后执行,publishProgress()用于更新进度等
*/
@Override
protected void onProgressUpdate(Integer... values) {
tv.setText(""+values[0]);
}
}
}
定时器 实现 的 三种方法
1. Handler类自带的postDelyed
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler.postDelayed(runnable, 1000); //初次执行 每隔1s执行
}
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
// handler自带方法实现定时器
try {
handler.postDelayed(this, 1000); //1000毫秒后再次启动
/*
* view 刷新方法
* 主线程可以直接调用Invalidate()方法刷新
* 子线程可以直接调用postInvalidate()方法刷新。
*/
Toast.makeText(MainActivity.this, "又一秒过去了", 1).show();
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
2. Handler+Thread
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new ThreadShow()).start();
}
// handler类接收数据
Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
System.out.println("receive....");
}
};
};
// 线程类
class ThreadShow implements Runnable {
@Override
public void run() {
while (true) { //通过使用无限循环
try {
Thread.sleep(1000); //使线程挂起一段时间 一秒
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
System.out.println("send...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
THREE
Handler+Timer+TimerTask
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer.schedule(task, 5000, 1000); // 5s后执行task ,之后每隔1s后都执行
//timer.cancel(); //终止计时器
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
System.out.println("omggggggggg");
}
super.handleMessage(msg);
};
};
Timer timer = new Timer(); //定时器
TimerTask task = new TimerTask() { //定时器事件
@Override
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
}