0

そこで、Web サイトから JSON を取得して解析する Android 用の Java クラスを作成しました。

public class Communicator {


    public String executeHttpGet(String URL) throws Exception 
    {
        BufferedReader in = null;
        try 
        {
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            request.setURI(new URI(URL));
            HttpResponse response = client.execute(request);
            InputStream ips  = response.getEntity().getContent();
            BufferedReader buf = new BufferedReader(new InputStreamReader(ips,"UTF-8"));

            StringBuilder sb = new StringBuilder();
            String s;
            while(true )
            {
                s = buf.readLine();
                if(s==null || s.length()==0)
                    break;
                sb.append(s);

            }
            buf.close();
            ips.close();
            return sb.toString();
        } 
        finally 
        {
            if (in != null) 
            {
                try 
                {
                    in.close();
                } 
                catch (IOException e)    
                {
                    Log.d("Exceptions !", e.toString());
                }
            }
        }
    }

}

アクセスしようとしているサイトとサンプル出力は次のとおりです。

http://www.railpnrapi.com/6520652825

{"tnum":"15694","tname":"BARAK VALLEY EX","tdate":"25-7-2013","from":"SCL","to":"LMG","class" :"SL","charted":true,"numofpax":1,"pax":[{"coach":"S1","berth":"8","quota":"GN","status" :"CNF"}]}

JSON を読み取るための INCOMPLETE コードは次のとおりです。

String page = new Communicator().executeHttpGet(url);
System.out.println(page)
JSONObject jsonObj = new JSONObject(page);
String id = jsonObj.getString("tname");
TextView t1 = (TextView)findViewById(R.id.textView1);
t1.setText(id);

JSON のほんの一部を TextView に出力しようとしましたが、うまくいきません。これは、事前に完全に解析する必要があるということですか?

また、LogCat には次のエラーが表示されます。

07-02 06:18:08.889: W/System.err(831): android.os.NetworkOnMainThreadException
07-02 06:18:08.899: W/System.err(831):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
07-02 06:18:08.899: W/System.err(831):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
07-02 06:18:08.899: W/System.err(831):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
07-02 06:18:08.899: W/System.err(831):  at java.net.InetAddress.getAllByName(InetAddress.java:214)
07-02 06:18:08.899: W/System.err(831):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
07-02 06:18:08.899: W/System.err(831):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
07-02 06:18:08.899: W/System.err(831):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
07-02 06:18:08.899: W/System.err(831):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
07-02 06:18:08.909: W/System.err(831):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
07-02 06:18:08.909: W/System.err(831):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
07-02 06:18:08.909: W/System.err(831):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
07-02 06:18:08.909: W/System.err(831):  at com.example.in.ddas.indianrailpnr.Communicator.executeHttpGet(Communicator.java:27)
07-02 06:18:08.909: W/System.err(831):  at com.example.in.ddas.indianrailpnr.PNRActivity$1.onTouch(PNRActivity.java:74)
07-02 06:18:08.919: W/System.err(831):  at android.view.View.dispatchTouchEvent(View.java:7241)
07-02 06:18:08.919: W/System.err(831):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
07-02 06:18:08.919: W/System.err(831):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
07-02 06:18:08.919: W/System.err(831):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
07-02 06:18:08.919: W/System.err(831):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
07-02 06:18:08.919: W/System.err(831):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
07-02 06:18:08.929: W/System.err(831):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
07-02 06:18:08.929: W/System.err(831):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
07-02 06:18:08.929: W/System.err(831):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
07-02 06:18:08.929: W/System.err(831):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
07-02 06:18:08.929: W/System.err(831):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
07-02 06:18:08.939: W/System.err(831):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)
07-02 06:18:08.939: W/System.err(831):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
07-02 06:18:08.939: W/System.err(831):  at android.app.Activity.dispatchTouchEvent(Activity.java:2410)
07-02 06:18:08.939: W/System.err(831):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901)
07-02 06:18:08.939: W/System.err(831):  at android.view.View.dispatchPointerEvent(View.java:7426)
07-02 06:18:08.949: W/System.err(831):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)
07-02 06:18:08.949: W/System.err(831):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)
07-02 06:18:08.949: W/System.err(831):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)
07-02 06:18:08.949: W/System.err(831):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)
07-02 06:18:08.949: W/System.err(831):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)
07-02 06:18:08.959: W/System.err(831):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
07-02 06:18:08.959: W/System.err(831):  at android.os.MessageQueue.nativePollOnce(Native Method)
07-02 06:18:08.959: W/System.err(831):  at android.os.MessageQueue.next(MessageQueue.java:125)
07-02 06:18:08.959: W/System.err(831):  at android.os.Looper.loop(Looper.java:124)
07-02 06:18:08.969: W/System.err(831):  at android.app.ActivityThread.main(ActivityThread.java:5041)
07-02 06:18:08.969: W/System.err(831):  at java.lang.reflect.Method.invokeNative(Native Method)
07-02 06:18:08.969: W/System.err(831):  at java.lang.reflect.Method.invoke(Method.java:511)
07-02 06:18:08.969: W/System.err(831):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-02 06:18:08.969: W/System.err(831):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-02 06:18:08.969: W/System.err(831):  at dalvik.system.NativeStart.main(Native Method)

では、アプリをインターネットに接続するにはどうすればよいですか (既に許可を設定していますが、機能しません)。どんな助けでも大歓迎です!

4

5 に答える 5

2

Asynctaskネットワーク関連の操作を行うには、 を使用する必要があります。

                 or

スレッドを作成し、スレッド内でネットワーク関連の操作を実行します。

UI スレッドでネットワーク関連の操作を実行しようとしています。ハニカムを投稿することはできません。

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

asynctask を呼び出す

   new TheTask().execute("myurl"); // invoke on ui thread.

非同期タスク

http://developer.android.com/reference/android/os/AsyncTask.html

class TheTask extends AsyncTask<String,Void,Void>
{

    @Override
    protected String doInBackground(String... params) {
             //params[0] is the url
        // TODO Auto-generated method stub
         // your network related operarion
             String result = executeHttpGet(params[0]);
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
            if(result!=null)
            {
                   // parse json string
            }   
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
    }
}
于 2013-07-02T06:22:42.120 に答える
0

メインスレッドとは別のスレッドでネットワークに関することを行う必要があります。これには ASyncTask を使用します。

AsyncTask の例: http://subinsebastien.tumblr.com/post/10319834334/simple-asynctask-example-in-android

于 2013-07-02T06:22:51.063 に答える
0

NetworkOnMainThreadException は、ネットワーク プロセスをメイン スレッドに配置できないことを意味します。代わりに非同期タスクを使用しますhttp://developer.android.com/reference/android/os/AsyncTask.html

于 2013-07-02T06:24:08.817 に答える
0

ラグナンダンは、あなたが直面している問題を十分に簡潔に説明しました....

ネットワーク関連の操作を行うために MainThread (UI Thread とも呼ばれます) を使用する必要がないのはなぜですか?

Ans- 1. UI スレッドには、ユーザー インターフェイスのレンダリングなどの他のタスクがあります。 2. 重要な OS 関連タスクで既に過負荷になっている UI スレッドを使用する代わりに。

そのため、wasの Thread クラスのAsynctaskようなタスクを処理する別のスレッドであるネットワーク関連のタスクで作業するために使用する方がよいでしょう。Java

次のリンクはオープンソース ライブラリであり、JSON の解析には少し高度ですが、はるかに役立ちます。

ここにリンクがあります

于 2013-07-02T06:37:46.850 に答える
0

こんにちは、あなたは JSON パーサーを探しているので、GSON Builder GSON-LINKをお勧めします。優れたチュートリアルはここにあります: ここにリンクの説明を入力してください

この lib の利点は、オブジェクトを 1 回定義するだけで、あらゆる解析状況でそれを使用でき、DataObject が得られることです:)

于 2013-07-02T06:32:28.810 に答える