2017-05-18 18 views
0

HTTP投稿リクエストを送信して出力を受け取る必要がありますが、アプリを実行するとアプリがクラッシュします。POSTリクエストをウェブサイトに送信して結果を受け取る

以下は私が使用するコードです。

public String getRequest(String url){ StringBuilder responseOutput = new StringBuilder();

try { 
     URL uri = new URL(url); 
     HttpURLConnection connection = (HttpURLConnection)uri.openConnection(); 

     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("USER-AGENT", "Mozilla/5.0"); 
     connection.setRequestProperty("ACCEPT-LANGUAGE", "en-US,en;0.5"); 
     connection.setDoOutput(true); 

     DataOutputStream dStream = new DataOutputStream(connection.getOutputStream()); 
     dStream.flush(); 
     dStream.close(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

     String line = ""; 

     while((line = br.readLine()) != null) { 
      responseOutput.append(line); 
     } 
     br.close(); 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return responseOutput.toString(); 
} 

これはクラッシュログです。

05-18 16:34:50.915 18272-18272/com.prisonvoicemail.appupdater E/AndroidRuntime: 
FATAL EXCEPTION: main 

    Process: com.prisonvoicemail.appupdater, PID: 18272 

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.prisonvoicemail.appupdater/com.prisonvoicemail.appupdater.MainActivity}: android.os.NetworkOnMainThreadException 

    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426) 

    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 

    at android.app.ActivityThread.-wrap11(ActivityThread.java) 

    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) 

    at android.os.Handler.dispatchMessage(Handler.java:102) 

    at android.os.Looper.loop(Looper.java:148) 

    at android.app.ActivityThread.main(ActivityThread.java:5443) 

    at java.lang.reflect.Method.invoke(Native Method) 

    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 

    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

    Caused by: android.os.NetworkOnMainThreadException 

    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1287) 

    at java.net.InetAddress.lookupHostByName(InetAddress.java:431) 

    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 

    at java.net.InetAddress.getAllByName(InetAddress.java:215) 

    at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29) 

    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188) 

    at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157) 

    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100) 

    at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357) 

    at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340) 

    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330) 

    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248) 

    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:437) 

    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114) 

    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:245) 

    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218) 

    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java) 

    at com.prisonvoicemail.appupdater.HTTPRequest.getRequest(HTTPRequest.java:72) 

    at com.prisonvoicemail.appupdater.MainActivity.onCreate(MainActivity.java:79) 

    at android.app.Activity.performCreate(Activity.java:6259) 

    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130) 

    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 

    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)  

    at android.app.ActivityThread.-wrap11(ActivityThread.java)  

    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)  

    at android.os.Handler.dispatchMessage(Handler.java:102)  

    at android.os.Looper.loop(Looper.java:148)  

    at android.app.ActivityThread.main(ActivityThread.java:5443)  

    at java.lang.reflect.Method.invoke(Native Method)  

    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)  

    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  
+0

メインスレッド例外で[アンドロイドOSネットワークの可能な重複](http://stackoverflow.com/questions/17365646/android-os-network-on-main-thread-exception) – yanivtwin

答えて

0

Androidは自由に彼を保つために(UIを制御)メインスレッド上のネットワーク呼び出しを許可doens't、あなたはいくつかの簡単なマルチスレッドを実行する必要があり、あなたはその操作のためにAsynctask見てみることができ、または(doinbackgroundに別のスレッドを呼び出しのコードを入れて

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

と:あなたが最初のレッスンのためにAsynctaskで始めることができ、このようなレトロフィット、バレーボール、Loopj等...

として外部ライブラリを使用します主人公ではないあなたの結果を得て、あなたがOnPostメソッドを取得した後に、あなたはOnPostメソッドを取得します(メインスレッド上で、ここでUIを変更できます)。

0

NetworkOnMainThreadExceptionこれは、アプリケーションのメインスレッドからこのメソッドを呼び出しているためです。

メインスレッドではネットワーク操作(ブロック操作)を実行しないでください。操作が完了するまでアプリケーションが停止します。また、関数呼び出しをAsyncTask内にラップし、AsyncTask.execute()を呼び出すと、問題が解決されます。例:

AsyncTask task = new AsyncTask() { 
    @Override 
    protected Object doInBackground(Object[] params) { 
     //do your stuff here 
     return null; 
    } 
}; 
task.execute(); 

歓声:)

+0

ありがとう。これは機能します。 –

+0

私の答えが目的を果たしたら、それを受け入れることができますか? –

関連する問題