访问服务器时如何捕获错误

时间:2013-11-12 17:58:12

标签: java android android-asynctask

我创建了我的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连接等。

2 个答案:

答案 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);
    }
}));