2013-07-23 51 views
0

我開發了一個用android,Json和Mysql登錄的代碼,我的代碼工作在模擬器(android 2.1)中,但它在智能手機(4.1)中崩潰,這是在日誌貓http連接的Android身份驗證錯誤android.os.networkonmainthreadexception

error in http connection android.os.networkonmainthreadexception 

錯誤這是我的代碼,如果有人可以幫助我改變的東西,讓我的應用程序運行到所有Android version.Thanks提前。

public class ConnexionmysqlActivity extends Activity { 

     private static final String strURL = "http://mercure.comze.com/mercure/logi.php"; 
    // private String result ; 
     private Button connexion ; 
     private EditText Logon ; 
     private EditText password ; 
     private JSONArray jArray; 
     private JSONObject json_data; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.login); 
      Button connexion = (Button) findViewById(R.id.btn); 
      final EditText Logon = (EditText) findViewById(R.id.login); 
      final EditText password = (EditText) findViewById(R.id.mdpt); 


      connexion.setOnClickListener(new View.OnClickListener() { 

       @SuppressWarnings("unused") 
       public void onClick(View v) { 
        String result =null; 
        InputStream is = null; 
        StringBuilder sb = new StringBuilder(); 
        ArrayList<NameValuePair> nameValuePairs=new ArrayList<NameValuePair>(); 
        nameValuePairs.add(new BasicNameValuePair("user",Logon.getText().toString())); 

        try{ 

         HttpClient httpclient = new DefaultHttpClient(); 
         HttpPost httppost = new HttpPost(strURL); 
         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
         HttpResponse response = httpclient.execute(httppost); 
         HttpEntity entity = response.getEntity(); 
         is = entity.getContent();  
        }catch(Exception e){ 
         Log.e("log_tag", "Error in http connection " + e.toString()); 
        } 
        try{ 
         BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 

         String line = null; 
         while ((line = reader.readLine()) != null) { 
          sb.append(line + "\n"); 

         } 
         is.close(); 
         result=sb.toString(); 

        }catch(Exception e){ 
         Log.e("log_tag", "Error in http connection " + e.toString()); 
        } 
        String essai=result.substring(0, 4) ; 
        try { 
         if (result.matches("<br >")){ 
          essai=result.substring(0, 2) ; 
         } 
         JSONArray jArray = new JSONArray(result); 
         int b=jArray.length(); 



          JSONObject json_data = jArray.getJSONObject(0); 


          String mot_pass = json_data.getString("mdp").toString(); 
          String login = json_data.getString("login").toString(); 
          if (mot_pass.equals(password.getText().toString())){ 

           Intent principale =new Intent(ConnexionmysqlActivity.this,compte.class); 
           principale.putExtra("login",login); 
           startActivity(principale); 

          } 
          else { 

           Toast.makeText(ConnexionmysqlActivity.this, "mot de pass invalide ", Toast.LENGTH_LONG).show(); 
          } 


        }catch(JSONException e){ 
        // Log.e("log_tag", "Error parsing data " + e.toString()); 
         Toast.makeText(ConnexionmysqlActivity.this, "Utilisateur Inexistant ", Toast.LENGTH_LONG).show(); 
        } 

       } 
       }); 

     } 
    } 

編輯:我改變了我的代碼一些變化(與的AsyncTask),但我的代碼這麼想的工作此時也,這就是我所做的更改:

public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.login); 
      Button connexion = (Button) findViewById(R.id.btn); 
      final EditText Logon = (EditText) findViewById(R.id.login); 
      final EditText password = (EditText) findViewById(R.id.mdpt); 


      connexion.setOnClickListener(new View.OnClickListener() { 

       @SuppressWarnings("unused") 
       public void onClick(View v) { 


        new callServiceTask().execute(); 

       } 
       }); 

     } 

      class callServiceTask extends AsyncTask<Void, Void, Void> 
      { 
       @Override 
       protected void onPreExecute() { 
        super.onPreExecute(); 
        pDialog = new ProgressDialog(ConnexionmysqlActivity.this); 
        pDialog.setMessage("Loading..."); 
        pDialog.setIndeterminate(false); 
        pDialog.setCancelable(true); 
        pDialog.show(); 
       } 
       @Override 
       protected Void doInBackground(Void... params) { 

        // call web service 
        ArrayList<NameValuePair> nameValuePairs=new ArrayList<NameValuePair>(); 
         nameValuePairs.add(new BasicNameValuePair("user",Logon.getText().toString())); 

         try{ 

          HttpClient httpclient = new DefaultHttpClient(); 
          HttpPost httppost = new HttpPost(strURL); 
          httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
          HttpResponse response = httpclient.execute(httppost); 
          HttpEntity entity = response.getEntity(); 
          is = entity.getContent();  
         }catch(Exception e){ 
          Log.e("log_tag", "Error in http connection " + e.toString()); 
         } 
         try{ 
          BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 

          String line = null; 
          while ((line = reader.readLine()) != null) { 
           sb.append(line + "\n"); 

          } 
          is.close(); 
          result=sb.toString(); 

         }catch(Exception e){ 
          Log.e("log_tag", "Error in http connection " + e.toString()); 
         } 
         String essai=result.substring(0, 4) ; 
         try { 
          if (result.matches("<br >")){ 
           essai=result.substring(0, 2) ; 
          } 
          JSONArray jArray = new JSONArray(result); 
          int b=jArray.length(); 



           JSONObject json_data = jArray.getJSONObject(0); 


           String mot_pass = json_data.getString("mdp").toString(); 
           String login = json_data.getString("login").toString(); 
           if (mot_pass.equals(password.getText().toString())){ 

            Intent principale =new Intent(ConnexionmysqlActivity.this,compte.class); 
            principale.putExtra("login",login); 
            startActivity(principale); 

           } 
           else { 

            Toast.makeText(ConnexionmysqlActivity.this, "mot de pass invalide ", Toast.LENGTH_LONG).show(); 
           } 


         }catch(JSONException e){ 
         // Log.e("log_tag", "Error parsing data " + e.toString()); 
          Toast.makeText(ConnexionmysqlActivity.this, "Utilisateur Inexistant ", Toast.LENGTH_LONG).show(); 
         } 
        return null; 
       } 

       @Override 
       protected void onPostExecute(Void resulta) { 

        //bind data in lisview or any other componet 
      pDialog.dismiss(); 
        super.onPostExecute(resulta); 
       } 

      } 

的logcat的:

07-23 08:16:53.028: W/dalvikvm(15420): threadid=11: thread exiting with uncaught exception (group=0x2b542210) 
07-23 08:16:53.048: E/AndroidRuntime(15420): FATAL EXCEPTION: AsyncTask #1 
07-23 08:16:53.048: E/AndroidRuntime(15420): java.lang.RuntimeException: An error occured while executing doInBackground() 
07-23 08:16:53.048: E/AndroidRuntime(15420): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
07-23 08:16:53.048: E/AndroidRuntime(15420): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
07-23 08:16:53.048: E/AndroidRuntime(15420): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
07-23 08:16:53.048: E/AndroidRuntime(15420): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
07-23 08:16:53.048: E/AndroidRuntime(15420): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
07-23 08:16:53.048: E/AndroidRuntime(15420): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
07-23 08:16:53.048: E/AndroidRuntime(15420): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
07-23 08:16:53.048: E/AndroidRuntime(15420): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
07-23 08:16:53.048: E/AndroidRuntime(15420): at java.lang.Thread.run(Thread.java:856) 
07-23 08:16:53.048: E/AndroidRuntime(15420): Caused by: java.lang.NullPointerException 
07-23 08:16:53.048: E/AndroidRuntime(15420): at com.project.mercureproject.ConnexionmysqlActivity$callServiceTask.doInBackground(ConnexionmysqlActivity.java:98) 
07-23 08:16:53.048: E/AndroidRuntime(15420): at com.project.mercureproject.ConnexionmysqlActivity$callServiceTask.doInBackground(ConnexionmysqlActivity.java:1) 
07-23 08:16:53.048: E/AndroidRuntime(15420): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
07-23 08:16:53.048: E/AndroidRuntime(15420): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
07-23 08:16:53.048: E/AndroidRuntime(15420): ... 5 more 
+1

您應該在'AsyncTask'中運行代碼以避免這種錯誤,因爲您無法在'MainThread'上執行網絡活動,並且'AsyncTask'將負責使線程處理此類活動。 – kabuto178

+0

謝謝你的回答,我試圖改變我的代碼(我把這些變化置於問題中)..但是我仍然在碾壓。 – Delgado

回答

0

您正在呼籲主線程Web服務..所以你在主線程execption讓網絡..調用Web服務中的AsyncTask

class callServiceTask extends AsyncTask<Void, Void, Void> 
{ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     // call web service 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 

     //bind data in lisview or any other componet 
     super.onPostExecute(result); 
    } 

} 

,並呼籲像這樣

new callServiceTask().execute(); 
+0

謝謝你的回答,我試圖改變我的代碼那樣(我把變化問題)..但我仍然粉碎。 – Delgado

+0

爲什麼消極我可以知道嗎? –

+0

@MassimoLoviso現在哪個執行你得到? –

2

添加您的OnCreate梅託德此代碼:

StrictMode.ThreadPolicy政策=新StrictMode.ThreadPolicy.Builder()permitAll()建(); StrictMode.setThreadPolicy(policy);

+0

這還沒有工作:/ – Delgado