2016-11-22 170 views
1

我是新來的Android和Java的發展,我的工作是Web開發人員和想學習Android的工作室和Java。的Android工作室HttpURLConnection的應用程序崩潰

像往常一樣學習新語言的時候,我首先要做的就是一些數據庫調用,在此只是JSON調用。

使用HttpURLConnection的,我已經在網上找到例子,它在我的主要功能工作時,我在Android Studio中運行它,但是當我把它裏面按鈕單擊功能和我的手機上運行我的應用程序,我的應用程序崩潰。

我也加了 到清單標籤裏面的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應該看到,因爲我不知道。

感謝您:)

+0

不要在主UI線程中使用異步任務編寫網絡調用。請看這個詳細的示例。 https://androidkennel.org/android-networking-tutorial-with-asynctask/ – John

+0

正如我所說的,我測試了它,如果它只是在Android Studio中返回的主要功能JSON,然後把它移動到點擊。虐待看看,你的榜樣馬上:)謝謝您的時間 – noitse

+0

刪除方法和按鈕的click.On點擊打印一些記錄,你將能夠看到Logs.Once你有你的AsyncTask運行,你會看到問題不在於點擊,而是如圖所示。由:android.os.NetworkOnMainThreadException引發。由於新我想你看這是well.You會得到一個非常清晰的畫面。 http://simpledeveloper.com/network-on-main-thread-error-solution/ – John

回答

2

停止不允許你讓主線程上的網絡連接,因爲這可以凍結UI線程,使您的應用程序沒有響應。這就是拋出異常的原因。

可以使按鈕關火一個新的線程或的AsyncTask完成動作。

例子: How to fix android.os.NetworkOnMainThreadException?

+0

它的工作原理,只是一個問題,現在,當我打電話給我的類去DB例如 新databaseCall()。執行(」試驗」, 「databaseString」); 我如何得到我的onClick功能響應,其中我打電話呢? – noitse

+1

您可以覆蓋的AsyncTask類的onPostExecute方法,因爲這種方法在UI線程上運行,以執行您的UI所需的操作。 – mWhitley

2
  1. 應用標籤之前給你的AndroidManifest.xml中添加: -

    <uses-permission android:name="android.permission.INTERNET"/> <application ..... </application>

  2. 即使在平凡的互聯網連接的HTTP請求可能需要大量的時間。因此凍結主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。你可以選擇你自己的名字。