1.Gson的使用
添加Gson,在app/build.gradle中的dependencies 下加入如下信息:
dependencies {
compile 'com.google.code.gson:gson:2.7'
}
Gson相对于JSONObject来说,要方便的多。比如:可以将JSON格式的字符串转换成对象或将对象直接转换成JSON格式的字符串等等。
//对象转json
Student student = new Student(1, "张三", "女");
Gson gson = new Gson();
String s = gson.toJson(student, Student.class);
Log.i("123123", s);
//json转对象
Student student1 = gson.fromJson(s, Student.class);
Log.i("123123", student1.toString());
//list转Json数组
Student student4 = new Student(1, "张三", "女");
Student student5 = new Student(2, "张三", "女");
Student student6 = new Student(3, "张三", "女");
List list = new ArrayList<Student>();
list.add(student4);
list.add(student5);
list.add(student6);
String str = gson.toJson(list
, new TypeToken<List<Student>>() {}.getType());
Log.i("123123", str);
//json数组转list
List<Student> students = gson.fromJson(str
, new TypeToken<List<Student>>() {}.getType());
for(Student stu:students){
Log.i("123123",stu.toString());
}
输出内容
.../123123: {"gender":"女","id":1,"name":"张三"}
.../123123: Student{id=1, name='张三', gender='女'}
.../123123: [{"gender":"女","id":1,"name":"张三"},{"gender":"女","id":2,"name":"张三"},{"gender":"女","id":3,"name":"张三"}]
.../123123: Student{id=1, name='张三', gender='女'}
.../123123: Student{id=2, name='张三', gender='女'}
.../123123: Student{id=3, name='张三', gender='女'}
2.使用AsyncTask
要使用AsyncTask需要指定3个泛型参数。
- params 执行AsyncTask时需要的信息,对应doInBackground(params… )
- Progress 需要在界面上显示当前的进度,指定泛型来作为进度单位,对应onProgressUpdate(Progress…)
- Result 对结果进行返回,指定泛型来作为返回值类型,对应onPostExecute(Result…)
下面展示个小程序,模拟下载过程,来说明一下AsyncTask的用法。
/*这里自定义了一个AsyncTask
*参数一:void,不需要传入信息
*参数二:Integer,用来作为进度显示单位
*参数三:Boolean,执行完成后的结果
* */
public class ImitateTask extends AsyncTask<Void, Integer, Boolean> {
private ProgressDialog progressDialog;
private Context context;
//模拟当前进度
private int i = 0;
public ImitateTask(ProgressDialog progressDialog, Context context) {
this.context = context;
this.progressDialog = progressDialog;
}
/**
* 任务开始之前调用,进行界面的初始化
*/
@Override
protected void onPreExecute() {
progressDialog.show();
}
/**
* doInBackground()方法中的代码会运行在子线程中,如果要更新UI,需要调用publishProgress()。
* 此方法主要处理耗时工作。
*/
@Override
protected Boolean doInBackground(Void... voids) {
while (true) {
int percent = download();
publishProgress(percent);//会去调用onProgressUpdate()
if (percent == 100) {
break;
}
}
return true;
}
//模拟下载功能
private int download() {
i++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return i;
}
/**
* 任务执行完毕后,对返回的数据做相应的操作
*/
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
progressDialog.dismiss();
if (aBoolean) {
Toast.makeText(context, "下载完毕", Toast.LENGTH_SHORT).show();
}
}
/**
* 更新进度条
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressDialog.setProgress(i);
}
}
pull_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProgressDialog progressDialog = new ProgressDialog(ABCActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
ImitateTask imitateTask = new ImitateTask(progressDialog, ABCActivity.this);
imitateTask.execute();
}
});
3.Service与Activity通信
在Android Studio中创建Service是非常方便的,在要创建Service的包右键→New→Service→Service。
活动和服务进行通信,需要靠Service中的onBind()。下面展示个小程序来说明怎么用。
public class MyService extends Service {
ImitateBinder imitateBinder = new ImitateBinder();
//创建内部类ImitateBinder并集成Binder,当Activity获取到ImitateBinder的实例就可以对其进行操作了。
class ImitateBinder extends Binder {
//充当下载
public void startDownload() {
Log.i("123123", "startDownload");
}
//充当下载进度
public int getProgress() {
Log.i("123123", "getProgress");
return 1;
}
}
@Override
public IBinder onBind(Intent intent) {
return imitateBinder;
}
}
在Activity中创建ServiceConnection,用来获取ImitateBinder的实例,在获取实例之前还需要将服务与活动绑定。
//绑定
bind_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ABCActivity.this, MyService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
}
});
//获取实例
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
imitateBinder = (MyService.ImitateBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
对service进行操控。
start_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imitateBinder.startDownload();
}
});
get_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imitateBinder.getProgress();
}
});
当service既调用了startService(),又调用bindService(),要使此服务销毁,要调用stopService()和unbindService()才能使得服务被销毁。