//数据库
public class MyHelper extends SQLiteOpenHelper {
//构造方法--确定数据库的名称,以及版本号
public MyHelper(Context context) {
super(context, "mydb", null, 1);
}
//创建数据库时被回调-只会回调一次
//一般用于创建数据表,初使化表中的数据
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//创建了一个jsoncache数据表
sqLiteDatabase.execSQL("create table jsoncache(id integer primary key autoincrement,urlpath text,jsondata text)");
}
//数据库版本升级时回调
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
}
}
public class JsonCacheDao {
private MyHelper myHelper;
public JsonCacheDao(Context context) {
myHelper = new MyHelper(context);
}
//添加方法
public void insertData(String path,String json){
//得到一个可读可写的数据库
SQLiteDatabase database=myHelper.getWritableDatabase();
//先删除,再插入
database.delete("jsoncache"," urlpath=?",new String[]{path});
ContentValues contentValues=new ContentValues();
//key:一定要是数据表中的列名
contentValues.put("urlpath",path);
contentValues.put("jsondata",json);
//第二个参数:强制要插入null值的列的列名
long rowid = database.insert("jsoncache", null, contentValues);
Log.d("zzz","插入的数据rowid:"+rowid);
}
//查询方法,根据url来查询数据
public String queryData(String path){
Log.d("zzz","---正在查询数据---");
String data="";
SQLiteDatabase db = myHelper.getWritableDatabase();
//查询
Cursor cursor = db.query("jsoncache", null, " urlpath=?", new String[]{path}, null, null, null);
while (cursor.moveToNext()){
data=cursor.getString(cursor.getColumnIndex("jsondata"));
}
return data;
}
}
public class MyHelper extends SQLiteOpenHelper {
//构造方法--确定数据库的名称,以及版本号
public MyHelper(Context context) {
super(context, "mydb", null, 1);
}
//创建数据库时被回调-只会回调一次
//一般用于创建数据表,初使化表中的数据
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//创建了一个jsoncache数据表
sqLiteDatabase.execSQL("create table jsoncache(id integer primary key autoincrement,urlpath text,jsondata text)");
}
//数据库版本升级时回调
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
}
}
网络连接工具类
package zhanghaijiao.bawei.com.zhanghaijiao180330.utils;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import zhanghaijiao.bawei.com.zhanghaijiao180330.R;
/**
* 得到网络状态的工具类
* Created by e531 on 2017/10/16.
*/
public class NetStateUtil {
/*
* 判断网络连接是否已开
* true 已打开 false 未打开
* */
public static boolean isConn(Context context){
boolean bisConnFlag=false;
ConnectivityManager conManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo network = conManager.getActiveNetworkInfo();
if(network!=null){
bisConnFlag=network.isAvailable();
}
return bisConnFlag;
}
/**
* 当判断当前手机没有网络时选择是否打开网络设置
* @param context
*/
public static void showNoNetWorkDlg(final Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setIcon(R.mipmap.ic_launcher) //
.setTitle(R.string.app_name) //
.setMessage("当前无网络").setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 跳转到系统的网络设置界面
Intent intent = null;
// 先判断当前系统版本
if(android.os.Build.VERSION.SDK_INT > 10){ // 3.0以上
intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
}else{
intent = new Intent();
intent.setClassName("com.android.settings", "com.android.settings.WirelessSettings");
}
context.startActivity(intent);
}
}).setNegativeButton("知道了", null).show();
}
}
mainacyivity
public class MainActivity extends AppCompatActivity {
private PullToRefreshListView plv;
private int pageIndex=1;
private String webUrl="https://api.tianapi.com/wxnew/?key=48a7d7193e11bd2dd4a683b6e2f90a4f&num=10&page="+pageIndex;
//定义一个大集合
private List<ResultData.NewslistBean> dataAll=new ArrayList<>();
private MyAdapter adapter;
private int operType=1;//1:代表刷新 2:代表加载更多
private Handler myHanlder=new Handler(){
@Override
public void handleMessage(Message msg) {
List<ResultData.NewslistBean> lists=( List<ResultData.NewslistBean>)msg.obj;
//显示数据
showData(lists);
}
};
private JsonCacheDao jsonCacheDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.找控件
plv = findViewById(R.id.plv);
//构造dao类,实现表的添加与查询操作
jsonCacheDao = new JsonCacheDao(this);
//2.初使化pulltoRefresh框架
initPlv();
//3.获取数据
//开启子线程请求网络 newThread+handler+httpUrlConnection请求网络数据
requestNetData();
}
//设置适配器
private void setLvAdapter(){
if(adapter==null){
adapter=new MyAdapter(MainActivity.this,dataAll);
plv.setAdapter(adapter);
}else{
adapter.notifyDataSetChanged();//刷新
}
}
private void requestNetData() {
//选进行网络是否连接的判断
if(NetStateUtil.isConn(this)){//联网状态
new Thread(){
@Override
public void run() {
try {
//1.创建一个URL对象
URL url=new URL(webUrl);
//2.打开连接
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
//3.进行设置
urlConnection.setRequestMethod("GET");
urlConnection.setReadTimeout(5000);
urlConnection.setConnectTimeout(5000);
//4.获取响应码进行判断
int responseCode = urlConnection.getResponseCode();
if(responseCode==200){
//5.获取数据
InputStream inputStream = urlConnection.getInputStream();
String content=stremToString(inputStream);
//插入到数据库
jsonCacheDao.insertData(webUrl,content);
//进行解析
List<ResultData.NewslistBean> newslist = asyncJson(content);
//发送消息
Message msg=Message.obtain();
msg.obj=newslist;
myHanlder.sendMessage(msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}else{//无网状态
Log.d("zzz","---无网状态,查询数据库中的数据---");
//NetStateUtil.showNoNetWorkDlg(this);
Toast.makeText(this,"现在没有网络,请稍后重试!",Toast.LENGTH_SHORT).show();
//根据现在的url查询出相应的json数据
String s = jsonCacheDao.queryData(webUrl);
//解析,展示
List<ResultData.NewslistBean> newslistBeans = asyncJson(s);
showData(newslistBeans);
}
}
/**
* 对json串进行解析
* @param json
* @return
*/
public List<ResultData.NewslistBean> asyncJson(String json){
Gson gson=new Gson();//json
ResultData data=gson.fromJson(json, ResultData.class);
//从对象中获取列表要显示的集体数据
List<ResultData.NewslistBean> newslist = data.getNewslist();
return newslist;
}
/**
* 展示数据
* @param lists
*/
public void showData(List<ResultData.NewslistBean> lists){
if(operType==1){
dataAll.clear();//清空集合中的所有数据
}
dataAll.addAll(lists);
//设置适配器
setLvAdapter();
//关闭头尾刷新视图
plv.onRefreshComplete();
}
private void initPlv() {
//1.设置支持的模式 BOTH:支持上下拉刷新 PULL_FROM_END:只支持加载更多 PULL_FROM_START:只支持下拉刷新
plv.setMode(PullToRefreshBase.Mode.BOTH);
//2.设置上下拉刷新的监听事件
plv.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {
//下拉刷新操作
operType=1;
pageIndex=1;
webUrl="https://api.tianapi.com/wxnew/?key=48a7d7193e11bd2dd4a683b6e2f90a4f&num=10&page="+pageIndex;
requestNetData();
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {
//上拉加载更多操作
operType=2;
pageIndex++;
webUrl="https://api.tianapi.com/wxnew/?key=48a7d7193e11bd2dd4a683b6e2f90a4f&num=10&page="+pageIndex;
requestNetData();
}
});
}
//将流转换成字符串
public String stremToString(InputStream stream){
StringBuilder builder=new StringBuilder();
try {
BufferedReader reader=new BufferedReader(new InputStreamReader(stream));
String str;
while ((str=reader.readLine())!=null){
builder.append(str);
}
} catch (Exception e) {
e.printStackTrace();
}
return builder.toString();
}
}