我创建了我的util来从服务器请求数据:
public class PushServer {
public static ArrayList<DataBean> getAllData() {
ArrayList<DataBean> data = new ArrayList<DataBean>();
String uriJson = "http://api.mydomain.com/news.html";
String resp = Utils.getResponseText1(uriJson);
try {
JSONObject json = new JSONObject(resp);
JSONArray jArray = json.getJSONArray("items");
for (int i=0; i<jArray.length(); i++) {
JSONObject jData = jArray.getJSONObject(i);
DataBean bean = new DataBean();
bean.setMenu_ID(jData.getString("ID"));
bean.setIsDisplay(jData.getString("First_Data"));
bean.setCategoryName(jData.getString("Second_Data"));
data.add(bean);
}
}
catch(Exception e) {
e.printStackTrace();
}
return data;
}
}
当我在AsyncTask中调用我的util时:
protected void onPreExecute() {
super.onPreExecute();
pgBar.setVisibility(View.VISIBLE);
}
protected Void doInBackground(Void... params) {
try {
databean = PushServer.getAllData();
} catch (Exception e) {
netError.setVisibility(View.VISIBLE);
}
return null;
}
我没有得到错误回复。当我的连接断开时,我的屏幕是空白的... 如果我的Android应用程序无法访问URL API,如何做出响应,例如Troubled连接等。
答案 0 :(得分:2)
您的代码中存在一些问题。大多数都不是那么重要,但从概念上讲,有一个很重要的一点:你不应该使用asynctask来访问android上的网络。
解释了AsyncTasks的缺陷in this thread。
此外,当遇到以正确方式捕获异常的问题时,AsyncTasks更糟糕:内置的错误处理没有。您仍然可以实现某种手动错误处理(保留异常,并通过getter访问它,然后询问在执行asynctasks时是否收到任何异常)。
但是越来越多的lib提供了更多有趣的替代方案,当涉及到网络时,他们中的大多数都为异步异常提出了一个很好的错误处理模型。看看我提到的主题,RoboSpice是其中的替代方案。如果您不喜欢它,它还会列出所有其他众所周知的替代方案at the end of the readme on github。
答案 1 :(得分:1)
您可以使用droidQuery库来简化此操作并提供错误处理:
final ArrayList<DataBean> data = new ArrayList<DataBean>();
$.ajax(new AjaxOptions().url("http://api.mydomain.com/news.html").success(new Function() {
@Override
public void invoke($ d, Object... args) {
JSONObject json = (JSONObject) args[0];
JSONArray jArray = json.getJSONArray("items");
for (int i=0; i<jArray.length(); i++) {
JSONObject jData = jArray.getJSONObject(i);
DataBean bean = new DataBean();
bean.setMenu_ID(jData.getString("ID"));
bean.setIsDisplay(jData.getString("First_Data"));
bean.setCategoryName(jData.getString("Second_Data"));
data.add(bean);
//hear you may want to make a call to handle the "next step" for how to process this bean.
}
}
}).error(new Function() {
@Override
public void invoke($ d, Object... args) {
AjaxError error = (AjaxError) args[0];
//print the error status code and reason to logcat
Log.e("Ajax", "Error " + error.status + ": " + error.reason);
}
}));