1

JsonURLからオブジェクトを返すこのコードがあります。では問題froyoなく動作しますが、同じコードが では動作しませんJelly Beans

私のコードに何か問題がありますか?

私を助けてください、これが私のコードです

    public static JSONObject getJSONfromURL(String url) {

    // initialize
    InputStream is = null;
    String result = "";
    JSONObject jArray = null;

    // http post
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();

    } catch (Exception e) {
        Log.e("log_tag", "Error in http connection " + e.toString());
    }

    // convert response to string
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();
    } catch (Exception e) {
        Log.e("log_tag", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jArray = new JSONObject(result);
    } catch (JSONException e) {
        Log.e("log_tag", "Error parsing data " + e.toString());
    }

    return jArray;
}

ここに私のログエラーがあります

11-01 11:01:48.437: E/log_tag(1044): Error in http connection android.os.NetworkOnMainThreadException 11-01 11:01:48.437: E/log_tag(1044): Error converting result java.lang.NullPointerException 11-01 11:01:48.437: E/log_tag(1044): Error parsing data org.json.JSONException: End of input at character 0 of

4

4 に答える 4

1

メインスレッドでネットワーク接続を確立しようとしています。代わりに を使用しますAsyncTask。ネットワーク タスクは時間がかかるためです。froyo ではメイン スレッドでネットワークを確立できますが、以降のバージョンの Android では を使用する必要がありますAsync Task

于 2012-11-01T05:39:45.767 に答える
1

バックグラウンド スレッドでサーバー呼び出しを行います。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new AsyncTask<Void,Void,Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            JSONObject jObject = getJSONfromURL("http://query.yahooapis.com/v1/public/yql?q=select%20item%20from%20weather.forecast%20where%20location%3D%2248907%22&format=json");
            return null;
        }
    }.execute();
}
public JSONObject getJSONfromURL(String url) {

    // initialize
    InputStream is = null;
    String result = "";
    JSONObject jArray = null;

    // http post
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();

    } catch (Exception e) {
        Log.e("log_tag", "Error in http connection " + e.toString());
    }

    // convert response to string
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();
    } catch (Exception e) {
        Log.e("log_tag", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jArray = new JSONObject(result);
    } catch (JSONException e) {
        Log.e("log_tag", "Error parsing data " + e.toString());
    }

    return jArray;
}
于 2012-11-01T05:42:30.067 に答える
1

Android API v15 から、メイン スレッドで動作する重いプロセスは必要ありません。したがって、次のソース コードのような別のスレッドにロジックを移動する必要があります。

new Thread(new Runnable() {
   public void run() {
        // your logic
   }                        
}).start();

詳細については、http://developer.android.com/guide/practices/responsiveness.html を参照してください

于 2012-11-01T05:42:54.187 に答える
1

ええ、AsyncTaskandroid.os.NetworkOnMainThreadExceptionを 使用してネットワーク関連のタスクを実行することに関するエラーです。

別の方法で、このコードを使用してこれを無効にすることができますonCreate()

if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = 
        new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}

ただし、StrictModeポリシーを無効にすることはお勧めできません。AsyncTask

于 2012-11-01T05:43:21.847 に答える