1

我创建了我的 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,我如何做出响应,例如出现故障的连接等。

4

2 回答 2

2

您的代码中有一些问题。大多数并不那么重要,但从概念上讲,有一个重要的:你不应该使用 asynctask 来访问 android 上的网络。

此线程中解释了 AsyncTasks 的缺陷。

此外,当涉及到以正确方式捕获异常的问题时,AsyncTasks 更糟糕:没有内置的错误处理。您仍然可以实现某种手动错误处理(保留异常,并通过 getter 使其可访问,然后在您的 asynctasks 完成时询问是否收到任何异常)。

但是当涉及到网络时,越来越多的库提供了更多有趣的替代方案,其中大多数为异步异常提出了一个很好的错误处理模型。看看我提到的线程,RoboSpice是其中的选择。如果您不喜欢它,它还会在 github 上的自述文件末尾列出所有其他众所周知的替代方案。

于 2013-11-12T18:13:06.160 回答
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);
    }
}));
于 2013-11-12T19:23:32.167 回答