2016-11-22 39 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。你可以选择你自己的名字。