2016-11-22 10 views
1

私はAndroidとJavaの開発には新しく、私はWeb開発者として働いており、AndroidのスタジオとJavaを学びたいと思っていました。AndroidスタジオhttpURLConnectionアプリクラッシュ

いつも新しい言語を学ぶとき、私はまずこのJSON呼び出しでデータベース呼び出しを行います。

httpURLConnectionを使用して、私はexample onlineを見つけました。アンドロイドスタジオでそれを実行すると、私の主な機能で動作しますが、クリック機能にボタンを入れてモバイルでアプリを実行すると、アプリがクラッシュします。

さらに、 マニフェストタグ内にAndroidManifest.xmlを追加しました。

ここで私はここで

11-22 19:47:46.354 24975-24975/com.example.adis.myapp I/System.out: I am here////////////////////////////////////////// 
11-22 19:47:46.494 24975-24975/com.example.adis.myapp D/AndroidRuntime: Shutting down VM 
11-22 19:47:46.494 24975-24975/com.example.adis.myapp W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41659e00) 
11-22 19:47:46.514 24975-24975/com.example.adis.myapp E/AndroidRuntime: FATAL EXCEPTION: main 

       Process: com.example.adis.myapp, PID: 24975 
        java.lang.IllegalStateException: Could not execute method for android:onClick 
         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
       ive Method) 
        Caused by: java.lang.reflect.InvocationTargetException 
         at java.lang.reflect.Method.invokeNative(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:515) 
         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
         at android.view.View.performClick(View.java:4457)  
         at android.view.View$PerformClick.run(View.java:18491)  
         at android.os.Handler.handleCallback(Handler.java:733)  
         at android.os.Handler.dispatchMessage(Handler.java:95)  
         at android.os.Looper.loop(Looper.java:136)  
         at android.app.ActivityThread.main(ActivityThread.java:5333)  
         at java.lang.reflect.Method.invokeNative(Native Method)  
         at java.lang.reflect.Method.invoke(Method.java:515)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:711)  
         at dalvik.system.NativeStart.main(Native Method)  
        Caused by: android.os.NetworkOnMainThreadException 
         at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1148) 
         at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
         at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
         at java.net.InetAddress.getAllByName(InetAddress.java:214) 
         at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28) 
         at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216) 
         at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122) 
         at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292) 
         at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 
         at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 
         at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 
         at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 
         at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503) 
         at com.example.adis.myapp.MainActivity.loginFunction(MainActivity.java:85) 
         at java.lang.reflect.Method.invokeNative(Native Method)  
         at java.lang.reflect.Method.invoke(Method.java:515)  
         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  
         at android.view.View.performClick(View.java:4457)  
         at android.view.View$PerformClick.run(View.java:18491)  
         at android.os.Handler.handleCallback(Handler.java:733)  
         at android.os.Handler.dispatchMessage(Handler.java:95)  
         at android.os.Looper.loop(Looper.java:136)  
         at android.app.ActivityThread.main(ActivityThread.java:5333)  
         at java.lang.reflect.Method.invokeNative(Native Method)  
         at java.lang.reflect.Method.invoke(Method.java:515)  
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)  
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:711)  
         at dalvik.system.NativeStart.main(Native Method)  
11-22 19:47:46.524 923-1275/? W/ActivityManager: Force finishing activity com.example.adis.myapp/.MainActivity 

を取得し、エラーが私のonClick関数である

public void loginFunction(View view) throws IOException, JSONException { 


    System.out.println("I am here//////////////////////////////////////////"); 
    try { 

     URL url = new URL("http://echo.jsontest.com/insert-key-here/insert-value-here/key/value"); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod("GET"); 
     conn.setRequestProperty("Accept", "application/json"); 

     if (conn.getResponseCode() != 200) { 
      throw new RuntimeException("Failed : HTTP error code : " 
        + conn.getResponseCode()); 
     } 

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

     String output; 
     System.out.println("Output from Server .... \n"); 
     while ((output = br.readLine()) != null) { 
      System.out.println(output); 
     } 

     conn.disconnect(); 

    } catch (MalformedURLException e) { 

     e.printStackTrace(); 

    } catch (IOException e) { 

     e.printStackTrace(); 

    } 



} 

私はしませんので、あなたには、いくつかの愚かな過ちを参照してください場合でも、Javaの初心者が表示されるはずです私に厳しいう。

が、これはUIスレッドを凍結し、アプリが応答しなく行うことができますので、あなたは、メインスレッド上のネットワーク接続を行うことが許されていない:)

+0

メインUIスレッドでは、非同期タスクを使用しないでください。この精巧なサンプルを見てください。 https://androidkennel.org/android-networking-tutorial-with-asynctask/ – John

+0

私が言ったように、アンドロイドスタジオのmain関数でjsonを返してからそれをクリックするとテストしました。病気を見て、あなたの例をすぐに取る:)あなたの時間をありがとう – noitse

+0

メソッドを削除し、click.Onのボタンをクリックすると、ログを表示することができるだろういくつかのログを印刷するあなたのasynctaskを実行している問題がクリックではなく、表示されていることを確認してください原因:android.os.NetworkOnMainThreadException。あなたの新しい私はあなたにもこのことを読んでほしいと思っています。あなたは非常に明確な画像を得るでしょう。 http://simpledeveloper.com/network-on-thread-error-solution/ – John

答えて

2

で停止をありがとうございました。そのため、例外がスローされます。

新しいスレッドまたはAsyncTaskをオフにして、アクションを完了できます。

例: How to fix android.os.NetworkOnMainThreadException?

+0

これは、ただ1つの質問ですが、今はDBに行く私のクラスを呼び出すときに new databaseCall()。execute( " test "、" databaseString "); 私はそれを呼び出したonClick関数でどのように応答しますか? – noitse

+1

AsyncTaskクラスのonPostExecuteメソッドをオーバーライドして、このメソッドがUIスレッド上で実行されるため、UIで必要なアクションを実行できます。 – mWhitley

2
  1. はApplicationタグの前に、あなたのAndroidManifest.xmlにこれを追加します -

    でも些細なインターネット接続のHTTPリクエストに<uses-permission android:name="android.permission.INTERNET"/> <application ..... </application>

  2. は、このように凍結膨大な時間がかかることがありますメインUIスレッドあなたができることは、ボタンがヒットしたときに新しいAsyncTaskを開始することです。

    のような別のクラスのコードを入れてください: -

    public class HTTPRequestTask extends AsyncTask<Void, Void, Void> { 
    
    @Override 
    protected Void doInBackground(Void... params){ 
    System.out.println("I am here//////////////////////////////////////////"); 
    try { 
    URL url = new URL("http://echo.jsontest.com/insert-key-here/insert-value-here/key/value"); 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
    conn.setRequestMethod("GET"); 
    conn.setRequestProperty("Accept", "application/json"); 
    
    if (conn.getResponseCode() != 200) { 
        throw new RuntimeException("Failed : HTTP error code : " 
          + conn.getResponseCode()); 
    } 
    
    BufferedReader br = new BufferedReader(new InputStreamReader(
         (conn.getInputStream()))); 
    
    String output; 
    System.out.println("Output from Server .... \n"); 
    while ((output = br.readLine()) != null) { 
        System.out.println(output); 
    } 
    
    conn.disconnect(); 
    
    } catch (MalformedURLException e) { 
    
        e.printStackTrace(); 
    
    } catch (IOException e) { 
    
        e.printStackTrace(); 
    
    } 
    

    そしてonClickButtonを変更するよう: -

    OnButtonclick(...){ ... HTTPRequestTask testTask =new HTTPRequestTask(); testTask.execute(); ...}

    PS - 私はHTTPRequestTaskとして新しいクラスを命名しました。あなたは自分の名前を選ぶことができます。

関連する問題