2016-07-21 2 views
0

Je reçois android.os.NetworkOnMainThreadException dans mon activité de connexion. Fondamentalement, j'essaie simplement de vérifier si l'identifiant de l'utilisateur et le mot de passe entré par l'utilisateur sont corrects, c'est-à-dire, l'utilisateur est autorisé à se connecter ou non. J'ai recherché une solution et je sais que l'exception a quelque chose à voir avec la mise en réseau sur le thread principal. Mais j'utilise AsyncTask. Je reçois toujours cette exception. Voici mon LoginActivity.javaandroid.os.NetworkOnMainThreadException Essayer d'accéder à la base de données à partir de l'activité android. Android Studio

public class LoginActivity extends AppCompatActivity { 

    JSONParser jsonParser = new JSONParser(); 
    // single product url 
    private static final String url_user_check_login = "##########################/android_connect/db_connect.php"; 
    int success=0; 
    String id=""; 
    String password=""; 
    private static final String TAG_SUCCESS = "success"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

//  Defining onClickListener for Login Button 
     Button loginBtn=(Button) findViewById(R.id.login_btn); 
     loginBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
//    Check credentials 
       EditText phone=(EditText)findViewById(R.id.phone_txt); 
       EditText pwd=(EditText)findViewById(R.id.password_txt); 
       id=phone.getText().toString(); 
       password=pwd.getText().toString(); 
       new CheckUserLogin().execute(); 
       if (success == 1) { 

        Intent intent=new Intent(getApplicationContext(), RideDetailsActivity.class); 
        startActivity(intent); 

       }else{ 
        // product with id not found 
       } 
      } 
     }); 
    } 
    class CheckUserLogin extends AsyncTask<String, String, String> { 

     protected String doInBackground(String... params) { 

      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 
        // Check for success tag 

        try { 
         // Building Parameters 
         List<NameValuePair> params = new ArrayList<NameValuePair>(); 
         params.add(new BasicNameValuePair("id", id)); 

         // getting product details by making HTTP request 
         // Note that product details url will use GET request 
         JSONObject json = jsonParser.makeHttpRequest(
           url_user_check_login, "GET", params); 

         // check your log for json response 
//      Log.d("Single Product Details", json.toString()); 

         // json success tag 
         success = json.getInt(TAG_SUCCESS); 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 

      return null; 
     } 


    } 
} 

Je ne sais pas si cela est important, mais j'ai essayé le débogage et mettre des points de rupture dans la méthode doInBackground mais mon débogueur ne tient pas seulement les points de rupture et il souffle juste après la nouvelle CheckUserLogin().execute(); déclaration.

Voici également ma trace de pile d'exception.

FATAL EXCEPTION: main 
android.os.NetworkOnMainThreadException 
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1128) 
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 org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:587) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:511) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:489) 
at com.heycabs.heycabs.JSONParser.makeHttpRequest(JSONParser.java:65) 
at com.heycabs.heycabs.LoginActivity$CheckUserLogin$1.run(LoginActivity.java:98)at android.os.Handler.handleCallback(Handler.java:800) 
at android.os.Handler.dispatchMessage(Handler.java:100) 
at android.os.Looper.loop(Looper.java:194) 
at android.app.ActivityThread.main(ActivityThread.java:5409) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606) 
at dalvik.system.NativeStart.main(Native Method) 
+1

Vous allez complètement à l'encontre de l'objectif d'utiliser 'AsyncTask' en exécutant tout ce qu'il y a sur le thread UI avec' runOnUiThread() '. C'est aussi pourquoi vous obtenez le 'NetworkOnMainThreadException'. –

+0

Merci d'avoir signalé cela. Je suis nouveau à android et j'utilise [ce] tutoriel (http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/) comme guide. Pouvez-vous me dire ce que je devrais changer? –

Répondre

0

Vous utilisez incorrectement Asynktask. success == 1 ne sera jamais exciter, car les commandes synchrones se produiraient en nanosecondes, et le réseau, prendrait plusieurs millisecondes.

Do startActivity(intent) sur l'achèvement Asynk .... enfin vous avez créé un nouveau fil, et en elle, est retourné à l'interface utilisateur un:

runOnUiThread(new Runnable() 

Ceci est incorrect. Veuillez lire la documentation au AsynkTask. Et read this example

+0

Merci d'avoir signalé cela. Je suis nouveau à android et j'utilise [ce] tutoriel (http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/) comme guide. Pouvez-vous me dire ce que je devrais changer? –

+0

A partir du tutoriel que vous avez lié, vérifiez les fonctions 'doInBackground' et' onPostExecute' d'AsynkTask. Ces fonctions sont les fonctions "avant" et "après" utilisées. Je vous suggère également fortement google Volley. C'est une bibliothèque reliée au réseau, qui facilite BEAUCOUP d'opérations de réseau, et est très facile à utiliser. – Bonatti