0

このコードは、古いapiバージョンで非常にうまく機能します。私はAPI8-2.2でそれを使用しました、そしてそれは私が望んでいたことをします。

しかし、Android 4.2.1を搭載した携帯電話でアプリを実行しようとすると、クラッシュしました。インターネットでこの問題を見つけようとしたところ、Asyntaskというものが必要であることがわかったので、探し始めましたが、まだわかりません。誰かがその問題で私を助けることができますか?

package com.thevnkid93.ucebnice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

    public class JSONParser {

        static InputStream is = null;
        static JSONObject jObj = null;
        static JSONArray jArr=null;
        static String json = "";

        // function get json from url
        // by making HTTP POST or GET method
        public static JSONArray makeHttpRequest(String url, String method,
                List<NameValuePair> params) {

            // Making HTTP request
            try {
                // check for request method
                if(method == "POST"){
                    // request method is POST
                    // defaultHttpClient
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost(url);
                    httpPost.setEntity(new UrlEncodedFormEntity(params,"utf-8"));

                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    is = httpEntity.getContent();

                }else if(method == "GET"){
                    // request method is GET
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    String paramString = URLEncodedUtils.format(params, "utf-8");
                    url += "?" + paramString;
                    HttpGet httpGet = new HttpGet(url);

                    HttpResponse httpResponse = httpClient.execute(httpGet);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    is = httpEntity.getContent();
                }           

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            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();
                json = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }

            // try parse the string to a JSON object
            try {
                jArr = new JSONArray(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }

            // return JSON String (Array)
            return jArr;

        }

}

Logcat:

02-23 23:01:10.540:E / AndroidRuntime(30520):android.os.NetworkOnMainThreadException

4

1 に答える 1

1

コードを見ると、それをAsyncTaskに変換するのは非常に簡単です。AsyncTaskJSONParser. makeHttpRequest()のメソッドに a をドロップするだけです。doInBackground()

ただし、コードで UI の変更を行っていないため、おそらくThreadを使用して回避できます。

Thread thread = new Thread() {
    @Override
    public void run() {
        try {
            JSONArray myArray = JSONParser. makeHttpRequest();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

thread.start();
于 2013-02-22T20:25:05.897 に答える