0

Android デバイスから Webservice に接続し、パラメーターを送信して json を取得します。Android API < 4.0 ex 2.3.3 でテストすると問題ありません 別のデバイスでテストすると、API は 4.0.3、4.0.4 で、json を受信できません。

これは私のコードです

json = getJson("http://search.twitter.com/search.json?result_type=recent&rpp=3&q=iphone");


private String getJson(String uri) {

    String json = null;
    try {
        URL url = new URL(uri);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Accept", "application/json");
        Log.d(TAG,"1");
        // conn.setConnectTimeout(10 * 1000); //6s
        if (conn.getResponseCode() == 200) {
            // get successfull
            // read Json
            Log.d(TAG,"2");
            BufferedInputStream in = new BufferedInputStream(conn.getInputStream());
            int len = 0;
            byte[] buf = new byte[1024];
            StringBuffer stringBuffer = new StringBuffer();
            while ((len = in.read(buf)) != -1) {
                String s = new String(buf, 0, len);
                stringBuffer.append(s);
            }
            Log.d(TAG,"3");

            json = stringBuffer.toString();
            Log.d(TAG,json);
        }
    } catch (Exception e) {
        Log.e(TAG, "error get json :" + e.toString());
        json = null;
    }
    return json;
}

エラー。

11-20 19:42:22.555: E/TEST(29097): error get json :android.os.NetworkOnMainThreadException
4

2 に答える 2

4

NetworkOnMainThreadExceptionはapi 11以降アンドロイドにあるため、2.3.3で動作します。接続を 使用する部分を別のスレッドに移動するか、AsyncTaskを使用することをお勧めします。HTTP

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
     int count = urls.length;
     long totalSize = 0;
     for (int i = 0; i < count; i++) {
         totalSize += Downloader.downloadFile(urls[i]);
         publishProgress((int) ((i / (float) count) * 100));
         // Escape early if cancel() is called
         if (isCancelled()) break;
     }
     return totalSize;
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
     showDialog("Downloaded " + result + " bytes");
 }
}
于 2012-11-20T12:54:32.093 に答える
0

Asynctask<> から Web サービスを呼び出します。問題は解決します。

于 2012-11-20T13:23:52.000 に答える