2017-04-10 18 views
0

Tutorialspointからコピーしましたが、それは私のためには動作していないようです。E/HttpHandler:例外:null

私はエラーE /のHttpHandlerを抱えている:例外:ヌル

import android.util.Log; 
import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.ProtocolException; 
import java.net.URL; 

public class HttpHandler { 

    private static final String TAG = HttpHandler.class.getSimpleName(); 

    public HttpHandler() { 
    } 

    public String makeServiceCall(String reqUrl) { 
     String response = null; 
     try { 
      URL url = new URL(reqUrl); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.setRequestMethod("GET"); 
      // read the response 
      InputStream in = new BufferedInputStream(conn.getInputStream()); 
      response = convertStreamToString(in); 
     } catch (MalformedURLException e) { 
      Log.e(TAG, "MalformedURLException: " + e.getMessage()); 
     } catch (ProtocolException e) { 
      Log.e(TAG, "ProtocolException: " + e.getMessage()); 
     } catch (IOException e) { 
      Log.e(TAG, "IOException: " + e.getMessage()); 
     } catch (Exception e) { 
      Log.e(TAG, "Exception: " + e.getMessage()); 
     } 
     return response; 
    } 

    private String convertStreamToString(InputStream is) { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     StringBuilder sb = new StringBuilder(); 

     String line; 
     try { 
      while ((line = reader.readLine()) != null) { 
       sb.append(line).append('\n'); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return sb.toString(); 
    } 
} 

私は、このスクリプトは、基本的な接続を確認し信じる、と私は私がチェックし、次の

HttpHandler sh = new HttpHandler(); 
    // Making a request to url and getting response 
    String url = "http://api.androidhive.info/contacts/"; 
    String jsonStr = sh.makeServiceCall(url); 

    if(jsonStr != null) { 
     System.out.println("success"); 
    } else { 
     System.out.println("failed"); 
    } 

をしましたURLにアクセスできたようです。エラーの原因は何もわかりません。また、マニフェストにインターネット権限を追加しました。

ログ

android.os.NetworkOnMainThreadException 
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1166) 
    at java.net.InetAddress.lookupHostByName(InetAddress.java:425) 
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:259) 
    at java.net.InetAddress.getAllByName(InetAddress.java:221) 
    at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29) 
    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232) 
    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124) 
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:278) 
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:216) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:391) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:341) 
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:199) 
    at com.techdepot_ph.maco.iannounce.HttpHandler.makeServiceCall(HttpHandler.java:33) 
    at com.techdepot_ph.maco.iannounce.SettingsFragment.syncdata(SettingsFragment.java:182) 
    at com.techdepot_ph.maco.iannounce.SettingsFragment$5$1.onClick(SettingsFragment.java:151) 
    at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157) 
    at android.os.Handler.dispatchMessage(Handler.java:111) 
    at android.os.Looper.loop(Looper.java:194) 
    at android.app.ActivityThread.main(ActivityThread.java:5847) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1010) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
failed 
+0

は、あなたが '' MANIFEST'ファイル内INTERNET'権限を追加しますか?はいの場合は、インターネットが動作していることを確認してください。 –

+0

ログを投稿できる場合は、デバッグする方が簡単です。 –

+0

@VishalChhodwaniはい、私はしました。 –

答えて

1

私はあなたのコードをテストしました。それはうまく動作しますが、メインスレッドからWebサービスを呼び出していることを愚かな間違いが1つあります。

NetworkOnMainThreadExceptionがあり

これであなたのコードを置き換えます

new AsyncTask<Void, Void, String>() 
     { 
      ProgressDialog progressDialog; 
      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 

       progressDialog = new ProgressDialog(MainActivity.this); 
       progressDialog.setCancelable(true); 
       progressDialog.show(); 
      } 

      @Override 
      protected String doInBackground(Void... params) 
      { 

       HttpHandler sh = new HttpHandler(); 
       // Making a request to url and getting response 
       String url = "http://api.androidhive.info/contacts/"; 
       String jsonStr = sh.makeServiceCall(url); 

       if(jsonStr != null) { 
        System.out.println("success"); 
       } else { 
        System.out.println("failed"); 
       } 

       return jsonStr; 
      } 

      @Override 
      protected void onPostExecute(String result) { 
       super.onPostExecute(result); 
       progressDialog.dismiss(); 

       System.out.println("result=="+result); 
      } 
     }.execute(); 
1

についてあなたはこの呼び出しを行っているコードの一部は、メインスレッドです。メインスレッドからネットワークコールを行うことはできません。

は次のようにコードを変更してみてください:あなたはまた、 AsyncTaskのようなヘルパークラスを利用することができます

new Thread(new Runnable() { 
    HttpHandler sh = new HttpHandler(); 
    // Making a request to url and getting response 
    String url = "http://api.androidhive.info/contacts/"; 
    String jsonStr = sh.makeServiceCall(url); 

    if(jsonStr != null) { 
     System.out.println("success"); 
    } else { 
     System.out.println("failed"); 
    } 
}).start(); 

。ここでのマルチスレッドの詳細については、Processes and Threads | Android Developers