2014-08-28 3 views
-2

Я новичок в разработке приложений для Android, когда я нажимаю кнопку входа в систему. Мое приложение разбивается и дает мне Fatal Exception, пожалуйста, помогите мне.FATAL EXCEPTION: AsyncTask # 1 2

А также я хотел бы использовать клавишу ENTER на softkeyboard вместо кнопки Вход

Войти класс

public class Login extends Activity implements OnClickListener { 

private ProgressDialog pDialog; 

Button btnLogin; 
    Button btnLinkToRegister; 
    EditText inputEmail; 
    EditText inputPassword; 
    TextView loginErrorMsg; 

    // JSON Response node names 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 

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

     // Importing all assets like buttons, text fields 
     inputEmail = (EditText) findViewById(R.id.loginEmail); 
     inputPassword = (EditText) findViewById(R.id.loginPassword); 
     btnLogin = (Button) findViewById(R.id.btnLogin); 

     btnLogin.setOnClickListener(this); 

     loginErrorMsg = (TextView) findViewById(R.id.login_error); 

     // Login button Click Event 
    } 


    public void onClick(View v) 
    { 


     if(v.getId()==R.id.btnLogin) 
     { 
      new LoginExecute().execute(); 

     } 
    } 
    class LoginExecute extends AsyncTask<String, String, String> 
    { 
     String email = inputEmail.getText().toString(); 
     String password = inputPassword.getText().toString(); 
     UserFunctions userFunction = new UserFunctions(); 
     JSONObject json = userFunction.loginUser(email, password); 


     protected String doInBackground(String... args) 
     { 
      try { 
       if(email.trim().length()>0 || password.trim().length()>0) 
       { 

        if (json.getString("STATUS") != null) { 
         loginErrorMsg.setText(""); 
         String res3 = json.getString("STATUS"); 
         System.out.println("Status = " +res3); 
         if(Integer.parseInt(res3) == 1){ 

         if (json.getString("role").equalsIgnoreCase("Inspector")) 
         { 
          loginErrorMsg.setText(""); 
          String res1 = json.getString("role"); 
          System.out.println("Role =" +res1); 
         String area = json.getString("area"); 
         String street = json.getString("street"); 
         String user_id = json.getString("user_id"); 
          if(res1.equals("Inspector")) 
          { 
           Intent dashboard = new Intent(getApplicationContext(), Inspector.class); 

           // Close all views before launching Dashboard 
           dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
           startActivity(dashboard); 
          // finish(); 

          } 

         } 
         else if (json.getString("role").equalsIgnoreCase("Clamper")) 
         { 
          loginErrorMsg.setText(""); 
          String res1 = json.getString("role"); 
          ; 
          if(res1.equals("Clamper")) 
          { 
           Intent dashboard1 = new Intent(getApplicationContext(), Clamper.class); 

           // Close all views before launching Dashboard 
           dashboard1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
           startActivity(dashboard1); 
           //finish(); 

          } 

         } 
         else if (json.getString("role").equalsIgnoreCase("Declamper")) 
         { 
          loginErrorMsg.setText(""); 
          String res22 = json.getString("role"); 

          System.out.println("Role =" +res22); 
          if(res22.equals("Declamper")) 
          { 
           Intent dashboard2 = new Intent(getApplicationContext(), Declamper.class); 

           // Close all views before launching Dashboard 
           dashboard2.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
           startActivity(dashboard2); 
           //finish(); 

          } 

         } 
         else if (json.getString("role").equalsIgnoreCase("Tower")) 
         { 
          loginErrorMsg.setText(""); 
          String res8 = json.getString("role"); 

          System.out.println("Role =" +res3); 
          if(res8.equals("Tower")) 
          { 
           Intent dashboard3 = new Intent(getApplicationContext(), Tower.class); 

           // Close all views before launching Dashboard 
           dashboard3.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
           startActivity(dashboard3); 
           //finish(); 

          } 

         } 

        }else{ 
         // Error in login 
         loginErrorMsg.setText("Incorrect username/password"); 
        } 
       } 
       }else{ 
        loginErrorMsg.setText("Blank username/password"); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
     protected void onPostExecute(String file_url) { 
      pDialog = new ProgressDialog(Login.this); 
      pDialog.setMax(25); 
      pDialog.setMessage("Processing...."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
      long delayInMillis = 2000; 
      Timer timer = new Timer(); 
      timer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        pDialog.dismiss(); 
       } 
      }, delayInMillis); 
     } 
    } 

ошибка файла журнала

08-28 09:08:13.136: W/dalvikvm(1348): threadid=11: thread exiting with uncaught exception (group=0xb2b0cba8) 
08-28 09:08:13.276: D/dalvikvm(1348): GC_FOR_ALLOC freed 205K, 7% free 3875K/4156K, paused 35ms, total 35ms 
08-28 09:08:13.286: E/AndroidRuntime(1348): FATAL EXCEPTION: AsyncTask #1 
08-28 09:08:13.286: E/AndroidRuntime(1348): Process: com.example.testlogin, PID: 1348 
08-28 09:08:13.286: E/AndroidRuntime(1348): java.lang.RuntimeException: An error occured while executing doInBackground() 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.os.AsyncTask$3.done(AsyncTask.java:300) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at java.lang.Thread.run(Thread.java:841) 
08-28 09:08:13.286: E/AndroidRuntime(1348): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:857) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.view.ViewGroup.invalidateChild(ViewGroup.java:4320) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.view.View.invalidate(View.java:10935) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.view.View.invalidate(View.java:10890) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.widget.TextView.checkForRelayout(TextView.java:6587) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.widget.TextView.setText(TextView.java:3813) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.widget.TextView.setText(TextView.java:3671) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.widget.TextView.setText(TextView.java:3646) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at com.example.testlogin.Login$LoginExecute.doInBackground(Login.java:185) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at com.example.testlogin.Login$LoginExecute.doInBackground(Login.java:1) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
08-28 09:08:13.286: E/AndroidRuntime(1348):  ... 4 more 
+0

then whats the solution –

+0

Вы даже прочитали ответ? – Apoorv

+0

или этот: http://stackoverflow.com/questions/5161951/android-only-the-original-thread-that-created-a-view-hierarchy-can-touch-its-vi – pomber

ответ

0

Проблема в том с этими линиями (и аналогичными):

loginErrorMsg.setText(""); 

AsyncTask предназначен для запуска в другом потоке, и вы не можете изменять пользовательский интерфейс из другого потока (это может быть очень плохо, если это разрешено).

Вам необходимо создать Runnable и запустить его в потоке пользовательского интерфейса или выполнить этот код в onPostExecute, как и другие элементы пользовательского интерфейса.

Как это:

String errorText = ""; 

private Runnable updateErrorMsg = new Runnable() { 

    @Override 
    public void run() { 
     loginErrorMsg.setText(errorText); 
    } 

}; 


     protected String doInBackground(String... args) 
    { 
     try { 
      if(email.trim().length()>0 || password.trim().length()>0) 
      { 

       if (json.getString("STATUS") != null) { 
        loginErrorMsg.setText(""); 
        String res3 = json.getString("STATUS"); 
        System.out.println("Status = " +res3); 
        if(Integer.parseInt(res3) == 1){ 

        if (json.getString("role").equalsIgnoreCase("Inspector")) 
        { 
         // change to this 
         errorText = ""; 
         runOnUiThread(updateErrorMsg); 
         String res1 = json.getString("role"); 
         System.out.println("Role =" +res1); 
        String area = json.getString("area"); 
        String street = json.getString("street"); 
        String user_id = json.getString("user_id"); 
         if(res1.equals("Inspector")) 
         { 
          Intent dashboard = new Intent(getApplicationContext(), Inspector.class); 

          // Close all views before launching Dashboard 
          dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
          startActivity(dashboard); 
         // finish(); 

         } 

        } 
        else if (json.getString("role").equalsIgnoreCase("Clamper")) 
        { 
         // change to this 
         errorText = ""; 
         runOnUiThread(updateErrorMsg); 
         String res1 = json.getString("role"); 
         ; 
         if(res1.equals("Clamper")) 
         { 
          Intent dashboard1 = new Intent(getApplicationContext(), Clamper.class); 

          // Close all views before launching Dashboard 
          dashboard1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
          startActivity(dashboard1); 
          //finish(); 

         } 

        } 
        else if (json.getString("role").equalsIgnoreCase("Declamper")) 
        { 
         loginErrorMsg.setText(""); 
         String res22 = json.getString("role"); 

         System.out.println("Role =" +res22); 
         if(res22.equals("Declamper")) 
         { 
          Intent dashboard2 = new Intent(getApplicationContext(), Declamper.class); 

          // Close all views before launching Dashboard 
          dashboard2.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
          startActivity(dashboard2); 
          //finish(); 

         } 

        } 
        else if (json.getString("role").equalsIgnoreCase("Tower")) 
        { 
         // change to this 
         errorText = ""; 
         runOnUiThread(updateErrorMsg); 
         String res8 = json.getString("role"); 

         System.out.println("Role =" +res3); 
         if(res8.equals("Tower")) 
         { 
          Intent dashboard3 = new Intent(getApplicationContext(), Tower.class); 

          // Close all views before launching Dashboard 
          dashboard3.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
          startActivity(dashboard3); 
          //finish(); 

         } 

        } 

       }else{ 
        // Error in login 
        // loginErrorMsg.setText("Incorrect username/password"); 
        // change to this 
        errorText = "Incorrect username/password"; 
        runOnUiThread(updateErrorMsg); 
       } 
      } 
      }else{ 
       // loginErrorMsg.setText("Blank username/password"); 
       // change to this 
       errorText = "Blank username/password"; 
       runOnUiThread(updateErrorMsg); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
+0

не могли бы вы предоставить мне исходный код –

+0

Я сделал правки - есть и другие способы, это только пример. Я бы, вероятно, установил текст ошибки, как я показал здесь, а затем поместил обновление сообщения об ошибке в onPostExecute, но я думаю, что это более полезный пример. – Jim

+0

Y его благодарность за работу. Можете ли вы, пожалуйста, объяснить мне пример того, как обновить сообщение об ошибке в onPostExecute также, пожалуйста, я хочу узнать, пожалуйста. –

0

Вы не можете позвонить setText на TextView внутри doInBackground, вы должны обновить интерфейс внутри onPostExecute когда задача выполнена выполнение, или использовать тему для изменения пользовательского интерфейса во время выполнения задачи (не рекомендуется).

Если вам нужно показать прогресс, вы можете использовать onProgressUpdate и publishProgress.

+0

Можете ли вы предоставить мне исходный код –

+0

Вам, вероятно, придется переработать всю свою задачу, чтобы разобрать весь JSON внутри doInBackground и * then * использовать результирующие данные для обновления вашего пользовательского интерфейса, запуска новых действий и т. д. ... – 2Dee

Смежные вопросы