1

特定の URL から JSON データを取得するアクティビティ「メッセージ」を作成しました。jsonデータを印刷するループを作ってみましたが、問題は別のところにありました。「json」に乗っNullPointerExceptionています。JSONArray

メッセージ クラス:

public class Messages extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    TextView tv = (TextView) findViewById(R.id.tv_messages);
    JSONArray json = JSONfunctions.getJSONfromURL("http://docs.blackberry.com/sampledata.json");

    tv.setText(json.length());
}

JSON 関数クラス:

public class JSONfunctions {

    public static JSONArray getJSONfromURL(String url) {
        InputStream is = null;
        String result = "";
        JSONArray 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 get data string ",
                    "Error converting result " + e.toString());
        }

        try {

            jArray = new JSONArray(result);
        } catch (JSONException e) {
            Log.e("log_tag create object ",
                    "Error parsing data " + e.toString());
        }

        return jArray;
    }
}

エラー:

08:11:43.683: HTTP 接続のエラー android.os.NetworkOnMainThreadException 08:11:43.693: 結果の変換エラー java.lang.NullPointerException: ロック == null 08:11:43.703: データ org.json.JSONException の解析エラー: 終了08:11:43.723 の文字 0 での入力: VM をシャットダウンしています 08:11:43.733: threadid=1: キャッチされない例外で終了するスレッド (group=0x40a70930) 08:11:43.923: ATAL 例外: メイン 08:11:43.923 : java.lang.RuntimeException: アクティビティ ComponentInfo を開始できません {com.example.sound/com.example.sound.Messages}: java.lang.NullPointerException 08:11:43.923: android.app.ActivityThread.performLaunchActivity(ActivityThread. java:2180) 08:11:43.923: android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 08:11:43.923: android.app.ActivityThread.access$600(ActivityThread.java:141) 08:11 :43.923: android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 08:11:43.923: android.os.Handler.dispatchMessage(Handler.java:99) 08:11:43.923: android.os .Looper.loop(Looper.java:137) 08:11:43.923: android.app.ActivityThread.main(ActivityThread.java:5039) 08:11:43.923: java.lang.reflect.Method.invokeNative(ネイティブ)メソッド) 08:11:43.923: java.lang.reflect.Method.invoke(Method.java:511) 08:11:43.923: com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 793) 08:11:43.923: com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560) 08:11:43.923: dalvik.system.NativeStart.main (ネイティブ メソッド) 08:11:43.923 : 原因: java.lang.NullPointerException 08:11:43.923: com.example.sound.Messages.onCreate(Messages.java:18) 08:11:43.923: android.app.Activity で。performCreate(Activity.java:5104) 08:11:43.923: android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 08:11:43.923: android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)

18行目は次のとおりです。

tv.setText(json.length());

上記のエラーの前に、私も多くのエラーを受け取ります:

Unexpected value from nativeGetEnabledTags: 0

私が使用している URL (テスト目的で、http://docs.blackberry.com/sampledata.json ) は動作しています。Android 開発と JSON は初めてです。前もって感謝します。

4

2 に答える 2

2

これは、Androidバージョン>=3.0で許可されていないメインスレッドでネットワーク操作を実行しているためです。

これを解決するには、次のいずれかを使用します

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
 StrictMode.setThreadPolicy(policy); 

また

Use AsyncTask 

http://developer.android.com/reference/android/os/AsyncTask.htmlから読む

于 2013-02-03T08:33:22.773 に答える
0

@TGMCians のおかげで、ASyncTask が仕事をしてくれました。私の活動は次のようになります。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;

public class Messages extends Activity {
    String THEURL = "http://docs.blackberry.com/sampledata.json";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_messages);
        new RetrieveMessages().execute(THEURL);
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        finish();
    }
    private class RetrieveMessages extends AsyncTask<String, Void, String> {
        protected String doInBackground(String... urls) {
            HttpClient client = new DefaultHttpClient();
            String json = "";
            try {
                String line = "";
                HttpGet request = new HttpGet(urls[0]);
                HttpResponse response = client.execute(request);
                BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                while ((line = rd.readLine()) != null) {
                    json += line + System.getProperty("line.separator");
                }
            } catch (IllegalArgumentException e1) {
                e1.printStackTrace();
            } catch (IOException e2) {
                e2.printStackTrace();
            }
            return json;
        }

        protected void onProgressUpdate(Void... progress) {

        }

        protected void onPostExecute(String result) {
            TextView tv = (TextView) findViewById(R.id.tv_messages);
            tv.setText(result);
        }
    }
}
于 2013-02-03T14:57:22.040 に答える