【问题标题】:Android studio httpURLConnection app crashAndroid studio httpURLConnection 应用程序崩溃
【发布时间】:2016-11-22 18:59:57
【问题描述】:

我是 Android 和 Java 开发的新手,我是一名 Web 开发人员,想学习 Android Studio 和 Java。

在学习新语言时,我首先要做的是一些数据库调用,在这个只是 JSON 调用中。

使用 httpURLConnection ,我在网上找到了示例,当我在 android studio 中运行它时,它可以在我的 main 函数中运行,但是当我将它放在 click 函数上的按钮内并在我的手机上运行我的应用程序时,我的应用程序崩溃了。

我也加了 到 AndroidManifest.xml 里面的 manifest 标签。

这是我得到的错误

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 线程中编写网络调用,为此使用异步任务。看看这个精心制作的示例。 androidkennel.org/android-networking-tutorial-with-asynctask
  • 正如我所说,我测试了它是否仅在 android studio 中返回 main 函数中的 json ,然后将其移至单击。我会马上看看你的例子:)谢谢你的时间
  • 删除该方法并在单击中打印一些日志。单击按钮后,您将能够看到日志。运行异步任务后,您将看到问题不在于单击但如图所示原因:android.os.NetworkOnMainThreadException。由于您的新我希望您也阅读此内容。您将获得非常清晰的图片。 simpledeveloper.com/network-on-main-thread-error-solution

标签: java android json onclick httpurlconnection


【解决方案1】:

您不能在主线程上建立网络连接,因为这会冻结 UI 线程并使您的应用无响应。这就是引发异常的原因。

您可以使按钮触发新线程或 AsyncTask 以完成操作。

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

【讨论】:

  • 它有效,只是一个问题,现在当我调用我的类去数据库时,例如 new databaseCall().execute("test","databaseString");如何在我调用它的 onClick 函数中获得响应?
  • 您可以重写 AsyncTask 类的 onPostExecute 方法以在 UI 中执行您想要的操作,因为该方法在 UI 线程上运行。
【解决方案2】:
  1. 将此添加到您的 AndroidManifest.xml 之前的 Application 标记:-

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2012-07-12
    • 2017-10-27
    • 2017-07-22
    相关资源
    最近更新 更多