2016-04-24 16 views
0

Derzeit habe ich einen Login-Code, der Daten an ein PHP-Skript sendet und die Datenausgabe durch das Skript (JSON-codiert) liest, um festzustellen, ob die Anmeldedaten korrekt sind.Login-Code stürzt ab?

Das folgende ist ein Teil meiner LoginActivity.java, aufgerufen, wenn die Login-Schaltfläche geklickt wird:

public void login(View view) { 
    String usernameValue = username.getText().toString(), 
      passwordValue = password.getText().toString(), 
      orgValue = org.getText().toString(); 

    if (orgValue.matches("")) { 
     snackbar.make(view, "Organisation cannot be blank", Snackbar.LENGTH_LONG).show(); 
    } else if (usernameValue.matches("")) { 
     snackbar.make(view, "Username cannot be blank", Snackbar.LENGTH_LONG).show(); 
    } else if (passwordValue.matches("")) { 
     snackbar.make(view, "Password cannot be blank", Snackbar.LENGTH_LONG).show(); 
    } else { 
     /** 
     * Login code goes here. 
     * This is where the error seems to be at. 
     */ 

     URL url; 
     String data; 

     try { 
      url = new URL("http://myurl.com/verify/users.php"); 

      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setReadTimeout(15000); 
      connection.setConnectTimeout(15000); 
      connection.setRequestMethod("POST"); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 

      data = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode(usernameValue, "UTF-8") + 
        "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(passwordValue, "UTF-8") + 
        "&" + URLEncoder.encode("org", "UTF-8") + "=" + URLEncoder.encode(orgValue, "UTF-8"); 

      OutputStream outputStream = connection.getOutputStream(); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8")); 
      writer.write(data); 

      writer.flush(); 
      writer.close(); 
      outputStream.close(); 

      int responseCode = connection.getResponseCode(); 

      if (responseCode == HttpURLConnection.HTTP_OK) { 
       JsonReader reader = new JsonReader(new InputStreamReader(connection.getInputStream())); 
       int success = -1; 
       String message = null; 

       reader.beginArray(); 

       while (reader.hasNext()) { 
        reader.beginObject(); 

        while (reader.hasNext()) { 
         String name = reader.nextName(); 

         switch (name) { 
          case "success": 
           success = reader.nextInt(); 
           break; 
          case "error_message": 
           message = reader.nextString(); 
           break; 
          default: 
           reader.skipValue(); 
           break; 
         } 
        } 
        reader.endObject(); 
       } 
       reader.endArray(); 
       reader.close(); 

       if (success == 1) { 
        snackbar.make(view, "You are successfully logged in as " + usernameValue + "!", Snackbar.LENGTH_LONG).show(); 
       } 
       else { 
        snackbar.make(view, "Error: " + message, Snackbar.LENGTH_LONG).show(); 
       } 
      } 
      else { 
       snackbar.make(view, "Error " + responseCode + " encountered. Please try again later.", Snackbar.LENGTH_LONG).show(); 
      } 

     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

Allerdings, wenn ich den Login-Button klicken, wird die App mit der folgenden Meldung in der logcat abgestürzt:

04-24 16:55:24.251 16674-16674/com.example.android.loginexample E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.example.android.loginexample, PID: 16674 
                       java.lang.IllegalStateException: Could not execute method for android:onClick 
                        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
                        at android.view.View.performClick(View.java:5242) 
                        at android.widget.TextView.performClick(TextView.java:10530) 
                        at android.view.View$PerformClick.run(View.java:21185) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:145) 
                        at android.app.ActivityThread.main(ActivityThread.java:6872) 
                        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:1404) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
                       Caused by: java.lang.reflect.InvocationTargetException 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at java.lang.reflect.Method.invoke(Method.java:372) 
                        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                        at android.view.View.performClick(View.java:5242)  
                        at android.widget.TextView.performClick(TextView.java:10530)  
                        at android.view.View$PerformClick.run(View.java:21185)  
                        at android.os.Handler.handleCallback(Handler.java:739)  
                        at android.os.Handler.dispatchMessage(Handler.java:95)  
                        at android.os.Looper.loop(Looper.java:145)  
                        at android.app.ActivityThread.main(ActivityThread.java:6872)  
                        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:1404)  
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)  
                       Caused by: android.os.NetworkOnMainThreadException 
                        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147) 
                        at java.net.InetAddress.lookupHostByName(InetAddress.java:418) 
                        at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 
                        at java.net.InetAddress.getAllByName(InetAddress.java:215) 
                        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:370) 
                        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:298) 
                        at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:399) 
                        at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:110) 
                        at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:221) 
                        at com.example.android.loginexample.LoginActivity.login(LoginActivity.java:68) 
                        at java.lang.reflect.Method.invoke(Native Method)  
                        at java.lang.reflect.Method.invoke(Method.java:372)  
                        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  
                        at android.view.View.performClick(View.java:5242)  
                        at android.widget.TextView.performClick(TextView.java:10530)  
                        at android.view.View$PerformClick.run(View.java:21185)  
                        at android.os.Handler.handleCallback(Handler.java:739)  
                        at android.os.Handler.dispatchMessage(Handler.java:95)  
                        at android.os.Looper.loop(Looper.java:145)  
                        at android.app.ActivityThread.main(ActivityThread.java:6872)  
                        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:1404)  
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

Jede Hilfe wird geschätzt! Vielen Dank im Voraus :)

Antwort

0

Wenn ich Sie wäre, würde ich nicht versuchen, eine URL-Anfrage im Haupt-Thread zu machen, und ich schlage vor, Sie verwenden AsyncTask dafür.
Allerdings, wenn Sie es wirklich im Hauptthread tun möchten, können Sie dies in Ihnen Aktivität des onCreate schreiben:

if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
} 
0
android.os.NetworkOnMainThreadException 

Die obige Zeile sagt alles. In android können Sie keine Netzwerkoperationen im Hauptthread durchführen. Sie führen hier eine HTTP-Anfrage durch. Verwenden Sie stattdessen AsyncTask oder einen anderen Thread.