备份短信需要在AndroidMainfest.xml中添加权限:
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.INTERNET"/>
2. 在APP目录下的build.gradle里面添加
compile 'com.google.code.gson:gson:2.4'
3. 先写一个activity main:
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
写model布局
· model布局为listview列表每一项的布局,是一项的布局,代码如下
· <?xml version="1.0" encoding="utf-8"?>
· <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
· android:layout_width="match_parent"
· android:layout_height="60dp"
· android:layout_marginLeft="10dp"
· android:orientation="horizontal">
·
· <ImageView
· android:layout_width="40dp"
· android:layout_height="60dp"
· android:background="@mipmap/ic_launcher"/>
· <LinearLayout
· android:layout_width="match_parent"
· android:layout_height="wrap_content"
· android:orientation="vertical">
· <TextView
· android:id="@+id/tv_name"
· android:layout_width="wrap_content"
· android:layout_height="wrap_content"
· android:text="name"/>
· <TextView
· android:id="@+id/tv_number"
· android:layout_width="wrap_content"
· android:layout_height="wrap_content"
· android:text="number"/>
· </LinearLayout>
· </LinearLayout>
再写stu
public class Stu
{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4. 再写StuAdapter
listview 的Adapter如下
public class StuAdapter extends BaseAdapter {
public List<Stu> list;
public Activity activity;
public StuAdapter(List<Stu> list,Activity activity)
{
this.list=list;
this.activity=activity;
}
public void setList(List<Stu> list)
{
this.list=list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//数据放到模版中
View view=View.inflate(activity,R.layout.model,null);
TextView textView_name=(TextView) view.findViewById(R.id.tv_name);
TextView textView_age=(TextView) view.findViewById(R.id.tv_number);
//放数据到控件上
textView_age.setText(list.get(position).getAge()+"");
textView_name.setText(list.get(position).getName());
return view;
}
}
然后MainActivity里面参考如下代码:
package iot.com.jingjizhaopin;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
public class MainActivity extends AppCompatActivity {
List<Stu> stulist=null;
ListView listView;
//设置一个handler,接受子线程传回UI线程的内容
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what)
{
case 200:
//完成数据绑定
if(stulist!=null)
{
//绑定数据
StuAdapter stuAdapter=new StuAdapter(stulist,MainActivity.this);
listView.setAdapter(stuAdapter);
}
break;
case -1:
//获取失败
Toast.makeText(MainActivity.this,"获取失败",Toast.LENGTH_SHORT).show();
break;
case -2:
//获取发生异常
Toast.makeText(MainActivity.this,"获取发生异常",Toast.LENGTH_SHORT).show();
break;
default:
//其他情况
Toast.makeText(MainActivity.this,"获取发生异常",Toast.LENGTH_SHORT).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(ListView)findViewById(R.id.list);
//从缓存获取数据,获取成功返回true,则绑定本地数据,否则从服务器获取数据
if(getDataFromCache())
{
//绑定数据
StuAdapter stuAdapter=new StuAdapter(stulist,MainActivity.this);
listView.setAdapter(stuAdapter);
}
else
{
//从服务器获取数据
getDataFromService();
}
}
//这个方法会返回一个判断值,如果在缓存获取成功,则返回true,并且将内容放到stulist里面,否则返回FALSE
private boolean getDataFromCache()
{
try {
//打开缓存文件『person』
SharedPreferences sp = MainActivity.this.getSharedPreferences("person", MODE_PRIVATE);
//获取字段为『studata』的数据
String data = sp.getString("studata", ""); //所有信息
JSONObject jsonObject=new JSONObject(data);
String Data= jsonObject.getString("data");
//如果获取到了data,则解析它并且将值放到stulist里面
if (data != "") {
Gson gson = new Gson();
stulist = gson.fromJson(Data, new TypeToken<List<Stu>>() {
}.getType());
//暂时没有添加时间过期的判断
return true;
} else {
stulist=null;
return false;
}
}catch (Exception ex)
{
ex.printStackTrace();
stulist=null;
return false;
}
}
private void getDataFromService()
{
final String path="http://10.10.192.1/stumanage/2.php";
// 开线程
new Thread(){
@Override
public void run() {
super.run();
//获取数据
try {
URL url = new URL(path);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET"); //必须大写
conn.setConnectTimeout(5000);
Log.d("JHH","try");
int code=conn.getResponseCode();
if(code==200)
{
Log.d("JHH","code:200 ");
//请求成功
InputStream inputStream=conn.getInputStream();
//然后把输入流转为字符串 。上网找一个把流转为字符串的函数
String abc=inputstream2string(inputStream);
//解析json字符串
//先拿到code 。 判断code是否等于200
// {"code":200,"pageindex":10,"isover":1,"data":[{"name":"\u5f20\u5b8f90","age":91},{"name":"\u5f20\u5b8f91","age":92},{"name":"\u5f20\u5b8f92","age":93},{"name":"\u5f20\u5b8f93","age":94},{"name":"\u5f20\u5b8f94","age":95},{"name":"\u5f20\u5b8f95","age":96},{"name":"\u5f20\u5b8f96","age":97},{"name":"\u5f20\u5b8f97","age":98},{"name":"\u5f20\u5b8f98","age":99},{"name":"\u5f20\u5b8f99","age":100}]}
JSONObject jsonObject=new JSONObject(abc);
if(jsonObject.getString("code").equals("200"))
{
//如果等于200。 服务器数据有效的
String Data= jsonObject.getString("data");
Gson gson=new Gson();
//studata=[{"name":"\u5f20\u5b8f90","age":91},。。。。]
stulist = gson.fromJson(Data, new TypeToken<List<Stu>>(){}.getType());
// 程序如果走到这个位置 。说明数据符合json格式。这时候我要把数据使用sharedpreference保存起来
//android 内存缓存
SharedPreferences sp=getSharedPreferences("person",MODE_PRIVATE); //person是文件名.
SharedPreferences.Editor editor=sp.edit();
editor.putString("studata",abc);//按照关键字 studata。 把字符串保存起来
editor.apply();
Log.d("JHH","获取数据成功");
Message message=new Message();
message.what=200; //200代码获取数据正常
handler.sendMessage(message);
Log.d("JHH","向主线程发送消息");
}
else
{
//返回码不是200的情况
Message message=new Message();
message.obj=abc; //定义带有数据的消息
message.what=202; //200代码获取数据正常
handler.sendMessage(message);
Log.d("JHH","发送消息正常");
}
}
else
{
//请求失败
Message message=new Message();
message.what=-1; //-1 代码获取数据失败
handler.sendMessage(message);
Log.d("JHH","请求失败");
}
}
catch (Exception ex)
{
Message message=new Message();
message.what=-2; //-1 代码获取数据时发生异常情况
//发送消息
handler.sendMessage(message);
Log.d("JHH","Exception");
}
}
}.start();
}
//把字节流转换成字符串,这个可以直接拿来用
private String inputstream2string(InputStream inputStream)
{
try {
ByteArrayOutputStream baos=new ByteArrayOutputStream();
int length=0;
byte[] buffer=new byte[1024];
while((length=inputStream.read(buffer))!=-1){
baos.write(buffer, 0, length);
}
inputStream.close();
baos.close();
return baos.toString();
} catch (Exception e) {
e.printStackTrace();
return "获取失败";
}
}
}