目录
SQLite数据库
1. SQLite的使用流程
DBHelper 继承 SQLiteOpenHelper
实现两个方法和带参数的构造方法
onCreate() onUngrade()
在构造方法中,创建数据库
在onCreate()方法中创建表和插入初始数据
在想要使用数据库连接的地方
实例化DBHelper
根据实例化的对象,调用 getWriteableDatabase,获取到数据库对象
用数据库对象,可以执行增删改查
释放资源
-
增删改 查
-
查询返回的是结果集
-
增删改返回的是受影响的行数
-
-
SQLite
-
db.rawQuery() 查询
-
db.execSQL() 增删改
-
广播接收者
广播接收者有几种?
标准广播接收者(静态、动态) 有序广播接收者
静态的广播接收者
第一步:创建一个广播接收者
第二步:在AndroidManifest.xml清单文件中进行注册
静态广播接收者在8.0以后会遇到问题,在发送广播是,需要设置报名 .setPackage(getPackageName())
动态广播接收者
第一步:创建一个广播接收者
第二步:在使用到他的地方进行实例化,属性设置,注册
第三步:onDestroy() unRegistBroadCast();反注册
以上为补充上一篇内容
Thread
第一种方式:
//开启方式继承Thread
class MyTherad extends Thread{
public void run(){
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
MyTherad myTherad = new MyTherad();
myTherad.start();
第二种方式:
//开启方式实现Ruuable接口
class MyRumable implements Runnable{
@Override
public void run() {
try {
Thread.sleep(3000);
Log.i("six", "hhhhhh");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
MyRumable myRumable = new MyRumable();
Thread thread = new Thread(myRumable);
thread.start();
第三种方式:(建议使用的)
//开启方式创建Ruuable匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("sss", "run");
}
}).start();
Handler
/**
* 从服务器接收到用户的昵称,并将昵称设置在textview对应的text属性上
*
* 连接服务器的功能,是属于耗时任务,所以必须放在子线程
*
* 子线程中是没有办法修改页面,借助Handler给主线程传递消息
*
* 主线程接收到消息后,开始执行修改UI
public class MainActivity2 extends AppCompatActivity {
// 声明容器
private TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
// 根据ID获取页面控件
tv1 = findViewById(R.id.tv1);
// 模拟一个连接服务器的过程
new Thread(new Runnable() {
@Override
public void run() {
try {
// 本意是想表达 连接服务器的耗时操作
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 假如从服务器获取到昵称为:炸炸最炸
String result = "炸炸最炸";
// 将昵称给textview设置上,在子线程中更新UI,是不允许的,必须使用handler将消息传递回去
Message message = new Message();
message.what = 1;
message.obj = result;
handler.sendMessage(message);
}
}).start();
}
private Handler handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
String result = (String) msg.obj;
tv1.setText(result);
}
}
};
}
进度条
public class MainActivity3 extends AppCompatActivity {
private ProgressBar progressBar;
int status = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
progressBar = findViewById(R.id.progressBar);
new Thread(new Runnable() {
@Override
public void run() {
// 循环对status进行值得修改
while (status < 100) {
try {
Thread.sleep(100);
status++;
handler.sendEmptyMessage(0x111);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
private Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0x111) {
progressBar.setProgress(status);
}
}
};
}
效果图:
Service解决ANR
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("serivce","服务已开启");
new Thread(new Runnable() {
@Override
public void run() {
long endtime = System.currentTimeMillis() + 20 * 1000; // 获取当前系统再加上20秒
while(System.currentTimeMillis() < endtime) {
synchronized (this){
try {
wait(endtime - System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
stopSelf();
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
结论:
Service不会自动开启线程,也不会自动停止线程