1

私は、http POST リクエストを実行する Android アプリケーションに取り組んでおり、従ったチュートリアルの結果、android.os.NetworkOnMainThreadException

元のコードはこのようなものでした。

public class JSONParser {

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

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));

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

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

    // return JSON String
    return jObj;

}
}

そして、このクラスはこの行で呼び出されました。

JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);

これを AsyncTask クラスに変更すると、コードは次のようになります。

class JSONParser extends AsyncTask<String, Void, JSONObject>{

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

// variables passed in:
String url;
List<NameValuePair> params;

// constructor
public JSONParser(String url, List<NameValuePair> params) {
    this.url = url;
    this.params = params;
}

@Override
protected JSONObject doInBackground(String... args) {
    // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));

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


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

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

        // return JSON String
        return jObj;
}

@Override
protected void onPostExecute(JSONObject jObj) {
    return;
}       
}

JSONObject私の質問は、この新しいAsyncTaskクラスから をjObj返すdoInBackground()にはどうすればよいですか?

何を変更する必要がありますか、または新しいJSONParserクラスをどのように呼び出して を返す必要がありJSONObjectますか?

4

4 に答える 4

1

このコードを見てください。JSON オブジェクトの解析を処理する方法についての洞察が得られるかもしれません。残りのすべてが正しく計算されているように見えたので、今のところ onPostExecute 関数を投稿しています。

doInBackground からのデータ オブジェクトが返される場所に関する疑問については、それをさらに解析できる onPostExecute に自動的に送信されます。

            @Override
    protected void onPostExecute(JSONObject result)
    {
        try
        {   
            JSONObject data = result.getJSONObject("data");
                      // whatever your JSON tag may be, in this case its data.

            if (data.isNull("data"))
            {
                      // action to handle null JSON object.
            }               
            else
            {
                JSONArray jarray = data.getJSONArray("data");   
                int len=jarray.length();
                for (int i = 0; i < jarray.length(); i++)
                {
                JSONObject obj = (JSONObject) jarray.get(i);

             String instanceName = obj.getString("instanceName");   
                        //extract data by whatever tag names you require, in this case instanceName.    
           } 
         }
} 
        catch (JSONException je)
        {
            je.printStackTrace();
            Log.d(TAG, "Error: " + je.getMessage());
        }       
    }
}
于 2013-04-12T05:02:29.077 に答える
0

jObj が doInBackground() で返されていることがわかりますが、どこに返されているのかわかりません。

doinBackground() の結果は onPostExecute() のパラメータとして受け取られます。onPostExecute() のパラメーターである doinBackground() で json オブジェクトを返しています。

@Override
protected void onPostExecute(JSONObject jObj) {
return;
} 

使用法

new JSONParser().execute("url);
class JSONParser extends AsyncTask<String, Void, JSONObject>{

   //string parameter to doInBackground()
   //JSONObject - result returned in doInBackground() received as a param in onPostExecute()
} 

asynctask のコンストラクターにパラメーターを渡すこともできます

 new JSONParser("url",params).execute(); 

あなたの非同期タスクで;

String url;
List<NameValuePair> params;

// constructor
public JSONParser(String url, List<NameValuePair> params) {
this.url = url;
this.params = params;
}
于 2013-04-12T04:42:25.927 に答える
0

あなたのdoInBackground方法から

@Override
protected JSONObject doInBackground(String... args) {

 return jObj;

}

あなたのJsonObjectリターン

@Override
protected void onPostExecute(JSONObject jObj) {

    // Here you get your return JsonObject
}  
于 2013-04-12T04:47:25.567 に答える