请求网络数据,解析JSON,显示在listview上(采用thread,handler,message)实现。
首先我们应该要之道,thread,handler,message,looper的关系。好吧,这个我就不多说了,不懂的百度下吧。。
首先我们开启一个线程。
new Thread(new FootUpDateExam(footHandler, 0x04)).start();传如handler,和what
class FootUpDateExam implements Runnable {
Handler handler;
int what;
public FootUpDateExam(Handler handler, int what) {
this.handler = handler;
this.what = what;
}
@Override
public void run() {
synchronized (this) {
List<Exam> newExams = examDao.getExamByThirdCateIdforPage( //查询本地数据库,如果本地有数据就查询本地数据 0x03为本地数据
cateId, 3, pageId);
pageId++;
if (newExams.size() == 10) {
for (Exam exam : newExams) {
if (exams.contains(exam)) {
continue;
}
exams.add(exam);
}
handler.sendEmptyMessage(0x03); // 更新本地
// handler.sendEmptyMessage(0x03); // 更新本地 发送一个message
} else {
addExamFromWeb(handler, what); //这里是:如果本地没有数据就请求网络数据
}
}
}
}
private void addExamFromWeb(Handler handler, int what) {
String strSId = "";
String strTid = "";
if (sId != -1) {
strSId = sId + "";
}
if (cateId != -1) {
strTid = cateId + "";
}
String url = PubCon.sxbGetExamListPort + "?sid=" + strSId + "&tid=" //这里是我要组接的URL,
+ strTid + "&page=" + pageId + "&type=3";
Log.v("tag", url);
System.out.println("url" + url);
httpUtil.getHtmlByThread(url, "UTF-8", handler, what); //这里面是封装好的里面会返回一个handler.sendEmptyMessage(0x04); 0x04为请求网络数据
}
这里你如果不用组接RUL,就直接给你的链接就好了。
然后外面再来看看handler
private void BinderHandler() {
footHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0x03:
// 本地更新
examAdapter.notifyDataSetChanged();
break;
case 0x04:
if (msg.obj == null) {
if (connCount == 2) {
DialogTool.showToash(ExamForecastListActivity.this
.getApplicationContext(), "网络不稳定请检查网络 ",
1000);
connCount = 0;
examAdapter.notifyDataSetChanged();
} else {
connCount++;
new Thread(new FootUpDateExam(footHandler, 0x04))
.start();
examAdapter.notifyDataSetChanged();
}
return;
}
jsonStr = msg.obj.toString();
if (jsonStr.length() > 10) {
JSONTokener jsonParser = new JSONTokener(jsonStr);
try {
JSONObject jsObj = (JSONObject) jsonParser
.nextValue();
exams.addAll(examDao.getExamFromJson(cateId, jsObj, //这里是JSON数据的解析。
3));
examAdapter.notifyDataSetChanged();
// lloutProgBar.setVisibility(View.GONE);
// Log.v("TAG", jsObj);
System.out.println("TAG" + jsObj);
System.out.println("examsSize:" + exams.size());
// if
} catch (JSONException e) {
e.printStackTrace();
}
} else {
DialogTool.showToash(ExamForecastListActivity.this
.getApplicationContext(), "该页面无内容", 3000);
footerView.setVisibility(View.INVISIBLE);
// examAdapter.notifyDataSetChanged();
}
if (lloutProgBar.getVisibility() == View.VISIBLE) { // 刷新
lloutProgBar.setVisibility(View.GONE);
lv_exam.setVisibility(View.VISIBLE);
}
connCount = 0;
// examAdapter.notifyDataSetChanged();
lv_exam.setSelection(lastSelect);
footerView.setVisibility(View.VISIBLE);
break;
}
examAdapter.notifyDataSetChanged();
flashBar.setVisibility(View.GONE);
tv_showMore.setText("查看更多");
}
};
}
最后就是适配了
mylistView.setAdapter(new MyListAdapter(this , listExper));
额,总感觉好马虎,但好像也只能也到这种地步了。。。唉。。见谅。。加油,亲们。
首先我们应该要之道,thread,handler,message,looper的关系。好吧,这个我就不多说了,不懂的百度下吧。。
首先我们开启一个线程。
new Thread(new FootUpDateExam(footHandler, 0x04)).start();传如handler,和what
class FootUpDateExam implements Runnable {
Handler handler;
int what;
public FootUpDateExam(Handler handler, int what) {
this.handler = handler;
this.what = what;
}
@Override
public void run() {
synchronized (this) {
List<Exam> newExams = examDao.getExamByThirdCateIdforPage( //查询本地数据库,如果本地有数据就查询本地数据 0x03为本地数据
cateId, 3, pageId);
pageId++;
if (newExams.size() == 10) {
for (Exam exam : newExams) {
if (exams.contains(exam)) {
continue;
}
exams.add(exam);
}
handler.sendEmptyMessage(0x03); // 更新本地
// handler.sendEmptyMessage(0x03); // 更新本地 发送一个message
} else {
addExamFromWeb(handler, what); //这里是:如果本地没有数据就请求网络数据
}
}
}
}
private void addExamFromWeb(Handler handler, int what) {
String strSId = "";
String strTid = "";
if (sId != -1) {
strSId = sId + "";
}
if (cateId != -1) {
strTid = cateId + "";
}
String url = PubCon.sxbGetExamListPort + "?sid=" + strSId + "&tid=" //这里是我要组接的URL,
+ strTid + "&page=" + pageId + "&type=3";
Log.v("tag", url);
System.out.println("url" + url);
httpUtil.getHtmlByThread(url, "UTF-8", handler, what); //这里面是封装好的里面会返回一个handler.sendEmptyMessage(0x04); 0x04为请求网络数据
}
这里你如果不用组接RUL,就直接给你的链接就好了。
然后外面再来看看handler
private void BinderHandler() {
footHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0x03:
// 本地更新
examAdapter.notifyDataSetChanged();
break;
case 0x04:
if (msg.obj == null) {
if (connCount == 2) {
DialogTool.showToash(ExamForecastListActivity.this
.getApplicationContext(), "网络不稳定请检查网络 ",
1000);
connCount = 0;
examAdapter.notifyDataSetChanged();
} else {
connCount++;
new Thread(new FootUpDateExam(footHandler, 0x04))
.start();
examAdapter.notifyDataSetChanged();
}
return;
}
jsonStr = msg.obj.toString();
if (jsonStr.length() > 10) {
JSONTokener jsonParser = new JSONTokener(jsonStr);
try {
JSONObject jsObj = (JSONObject) jsonParser
.nextValue();
exams.addAll(examDao.getExamFromJson(cateId, jsObj, //这里是JSON数据的解析。
3));
examAdapter.notifyDataSetChanged();
// lloutProgBar.setVisibility(View.GONE);
// Log.v("TAG", jsObj);
System.out.println("TAG" + jsObj);
System.out.println("examsSize:" + exams.size());
// if
} catch (JSONException e) {
e.printStackTrace();
}
} else {
DialogTool.showToash(ExamForecastListActivity.this
.getApplicationContext(), "该页面无内容", 3000);
footerView.setVisibility(View.INVISIBLE);
// examAdapter.notifyDataSetChanged();
}
if (lloutProgBar.getVisibility() == View.VISIBLE) { // 刷新
lloutProgBar.setVisibility(View.GONE);
lv_exam.setVisibility(View.VISIBLE);
}
connCount = 0;
// examAdapter.notifyDataSetChanged();
lv_exam.setSelection(lastSelect);
footerView.setVisibility(View.VISIBLE);
break;
}
examAdapter.notifyDataSetChanged();
flashBar.setVisibility(View.GONE);
tv_showMore.setText("查看更多");
}
};
}
最后就是适配了
mylistView.setAdapter(new MyListAdapter(this , listExper));
额,总感觉好马虎,但好像也只能也到这种地步了。。。唉。。见谅。。加油,亲们。