服务
1.定义
1)实现程序后台运行的解决方法,适合去执行那些不需要和用户交互而且还要求长期运行的任务。
2)服务的运行不依赖于任何用户界面,程序切换到后台或者打开另一个程序。
3)服务不是运行在一个独立的进程中,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。
4)服务不会自动开启线程,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞的情况。
2.多线程编程
1)线程的基本用法
a.定义一个线程只需要新建一个类继承自Thread,然后重写run()方法,启动线程只 需要new出一个MyThread的实例,然后调用它的start()方法。
classMyThread extends Thread
{
@override
public void run()
{
}
}
b.使用继承的方式耦合性有点高,更多的时候会选择实现Runnable接口的方法来定义 一个线程
classThread implements Runnable
{
@override
public void run()
{
}
}
启动的方法
MyThreadmyThrea = new Thread();
newThread(myThread).start();
3.也可以使用匿名类的方式去实现Runnable接口
newThread (new Runable(){
@override
public void run()
{
}
}).start();
2)在子线程中更新UI >>>异步消息处理
和许多其他的GUI库一样,Android的UI也是线程不安全的。也就是说,如果想要更新 应用程序里的UI元素,则必须在主线程中进行,否则就会出现异常。
但有些时候,我们必须去子线程里去执行一些耗时任务,然后根据任务的执行结果来更新UI控件,对于这种情况,Android提供了一套异步消息处理机制,完美地解决了在子 线程中进行UI操作的问题。
package com.my.androidthreadtest;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
//常量用于表示更新TextView
private static final int UPDATE_TEXT = 1;
private Button changeText;
private TextView text1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
changeText = findViewById(R.id.changeText);
text1 = (TextView) findViewById(R.id.text);
changeText.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.changeText:
new Thread(new Runnable() {
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);
}
}).start();
break;
default:
break;
}
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case UPDATE_TEXT:
//在这里可以进行UI操作
text1.setText("Nice to meet you");
break;
default:
break;
}
}
};
}