在接口中实现
来源:互联网 发布:目前就业形势 数据分析 编辑:程序博客网 时间:2024/06/05 05:20
备份短信需要在AndroidMainfest.xml中添加权限:
<uses-permissionandroid:name="android.permission.READ_SMS"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permissionandroid: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"?>
· <LinearLayoutxmlns: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如下
publicclassStuAdapterextendsBaseAdapter {
public List<Stu> list;
public Activity activity;
public StuAdapter(List<Stu> list,Activityactivity)
{
this.list=list;
this.activity=activity;
}
publicvoid setList(List<Stu> list)
{
this.list=list;
}
@Override
publicint getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
publiclong getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroupparent) {
//数据放到模版中
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;
importandroid.content.SharedPreferences;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.widget.ListView;
importandroid.widget.Toast;
importcom.google.gson.Gson;
importcom.google.gson.reflect.TypeToken;
importorg.json.JSONObject;
importjava.io.ByteArrayOutputStream;
importjava.io.InputStream;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.util.List;
publicclassMainActivityextendsAppCompatActivity {
List<Stu> stulist=null;
ListView listView;
//设置一个handler,接受子线程传回UI线程的内容
Handler handler =new Handler(){
@Override
publicvoid handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what)
{
case200:
//完成数据绑定
if(stulist!=null)
{
//绑定数据
StuAdapterstuAdapter=newStuAdapter(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
protectedvoid 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
privateboolean getDataFromCache()
{
try {
//打开缓存文件『person』
SharedPreferences sp =MainActivity.this.getSharedPreferences("person", MODE_PRIVATE);
//获取字段为『studata』的数据
String data =sp.getString("studata",""); //所有信息
JSONObject jsonObject=newJSONObject(data);
String Data=jsonObject.getString("data");
//如果获取到了data,则解析它并且将值放到stulist里面
if (data !="") {
Gson gson =new Gson();
stulist = gson.fromJson(Data,newTypeToken<List<Stu>>() {
}.getType());
//暂时没有添加时间过期的判断
returntrue;
}else {
stulist=null;
returnfalse;
}
}catch (Exception ex)
{
ex.printStackTrace();
stulist=null;
returnfalse;
}
}
private voidgetDataFromService()
{
final String path="http://10.10.192.1/stumanage/2.php";
//开线程
new Thread(){
@Override
publicvoid run() {
super.run();
//获取数据
try {
URL url =new URL(path);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET"); //必须大写
conn.setConnectTimeout(5000);
Log.d("JHH","try");
intcode=conn.getResponseCode();
if(code==200)
{
Log.d("JHH","code:200");
//请求成功
InputStreaminputStream=conn.getInputStream();
//然后把输入流转为字符串。上网找一个把流转为字符串的函数
Stringabc=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}]}
JSONObjectjsonObject=newJSONObject(abc);
if(jsonObject.getString("code").equals("200"))
{
//如果等于200。服务器数据有效的
StringData= jsonObject.getString("data");
Gsongson=new Gson();
//studata=[{"name":"\u5f20\u5b8f90","age":91},。。。。]
stulist =gson.fromJson(Data,newTypeToken<List<Stu>>(){}.getType());
//程序如果走到这个位置。说明数据符合json格式。这时候我要把数据使用sharedpreference保存起来
//android内存缓存
SharedPreferencessp=getSharedPreferences("person",MODE_PRIVATE);//person是文件名.
SharedPreferences.Editor editor=sp.edit();
editor.putString("studata",abc);//按照关键字 studata。 把字符串保存起来
editor.apply();
Log.d("JHH","获取数据成功");
Messagemessage=new Message();
message.what=200;//200代码获取数据正常
handler.sendMessage(message);
Log.d("JHH","向主线程发送消息");
}
else
{
//返回码不是200的情况
Messagemessage=new Message();
message.obj=abc; //定义带有数据的消息
message.what=202;//200代码获取数据正常
handler.sendMessage(message);
Log.d("JHH","发送消息正常");
}
}
else
{
//请求失败
Messagemessage=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 {
ByteArrayOutputStreambaos=newByteArrayOutputStream();
int length=0;
byte[] buffer=newbyte[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"获取失败";
}
}
}
- 在接口中实现
- 实现接口事件,在接口中实现事件
- 在接口中不要存在实现代码
- 9.4.2.1 在 F# 中实现接口
- C#在Unity中接口的实现
- 在适配器中实现接口SectionIndexer
- 接口中定义的方法在抽象类中实现
- 在WPF中实现INotifyPropertyChanged接口的辅助snippets
- 在WPF中实现INotifyPropertyChanged接口的辅助snippets
- 在Java中正确实现可序列化接口(Serializable)
- 在枚举类中实现带方法的接口
- 在MFC中利用IPicture接口----实现图片显示
- 初学ICommand接口,UI响应在viewmodel中实现
- 浅谈在JAVA中使用接口引用实现类
- 在eclipse中怎么快速找到实现接口在继承类中的实现方法
- 用ATL实现在COM接口中返回另一个COM类的接口
- 在JAVA中类实现序列接口Serializable接口的用处
- 接口中同一个方法不写public,为什么在实现类中一定要写public呢?
- 第二个小程序 十进制与十六进制的转换
- ios开发经验总结
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- C/C++ sizeof函数解析——解决sizeof求结构体大小的问题
- 管道流
- 在接口中实现
- 如何更好的使用Echarts,做好地图?
- DIY使用Arduino给3D打印机增加完事后自动关机功能
- Nginx开发从入门到精通
- orcle用户授权
- FIN7 APT组织攻击木马分析报告
- 非常实用的15款开源PHP类库
- 线程协作
- 内容提供者