问题:Android 低版本网络操作正常,4.0(ICS)以上出错

原因:4.0以上强制要求不能在主线程执行耗时的网络操作,网络操作需要使用Thead+Handler或AsyncTask

解决方案:网络操作改用Thead+Handler或AsyncTask异步线程,本文将介绍AsyncTask的使用方法

1、添加类:

HttpTask.java

public class HttpTask extends AsyncTask<String, Integer, String> {
    private static final String TAG = "HTTP_TASK";

    @Override
    protected String doInBackground(String... params) {
        // Performed on Background Thread
        String url = params[0];
        try {
            String json = new NetworkTool().getContentFromUrl(url);
            return json;
        } catch (Exception e) {
            // TODO handle different exception cases
            Log.e(TAG, e.toString());
            e.printStackTrace();
            return null;
        }
    }

    @Override
    protected void onPostExecute(String json) {
        // Done on UI Thread
        if (json != null && json != "") {
            Log.d(TAG, "taskSuccessful");
            int i1 = json.indexOf("["), i2 = json.indexOf("{"), i = i1 > -1
                    && i1 < i2 ? i1 : i2;
            if (i > -1) {
                json = json.substring(i);
                taskHandler.taskSuccessful(json);
            } else {
                Log.d(TAG, "taskFailed");
                taskHandler.taskFailed();
            }
        } else {
            Log.d(TAG, "taskFailed");
            taskHandler.taskFailed();
        }
    }

    public static interface HttpTaskHandler {
        void taskSuccessful(String json);

        void taskFailed();
    }

    HttpTaskHandler taskHandler;

    public void setTaskHandler(HttpTaskHandler taskHandler) {
        this.taskHandler = taskHandler;
    }

}

NetworkTool.java

public class NetworkTool {
    public String getContentFromUrl(String url) {
        StringBuilder sb = new StringBuilder();
        try {
            InputStream is = new URL(url).openStream();
            InputStreamReader isr = new InputStreamReader(is, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            is.close();
        } catch (final IOException e) {
            return null;
        }
        return sb.toString();
    }
}

2、调用方法

HttpTask task = new HttpTask();
task.setTaskHandler(new HttpTaskHandler(){
    public void taskSuccessful(String json) {
       try {
JSONObject jsonObj = new JSONObject(json);
String demo = jsonObj.getString("demo");
    } catch (Exception e) {
e.printStackTrace();
       }

} public void taskFailed() { } }); task.execute("http://www.yourdomain.com/api/getjson");

taskSuccessful-成功,taskFailed-失败

posted on 2013-03-19 20:53  厦门海之星  阅读(1916)  评论(0编辑  收藏  举报