【问题标题】:FATAL EXCEPTION: AsyncTask #1 2 [duplicate]致命异常:AsyncTask #1 2 [重复]
【发布时间】:2014-08-28 13:22:31
【问题描述】:

我是 android 应用程序开发的新手,当我按下登录按钮时,我的应用程序崩溃并给了我一个致命异常,请帮帮我。

我也想在软键盘上使用 ENTER 键而不是登录按钮

登录类

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

【问题讨论】:

  • 那么解决办法是什么
  • 你读过答案吗?
  • "而且我想在软键盘上使用 ENTER 键而不是登录按钮" >> 这是一个完全不同的问题,您需要发布一个不同的问题(或者更好的是,寻找类似的问题在这里)。

标签: android android-asynctask fatal-error keyevent


【解决方案1】:

问题在于这些行(和类似的行):

loginErrorMsg.setText("");

AsyncTask 被设计为在另一个线程中运行,您不能从另一个线程修改 UI(如果允许,那可能会非常糟糕)。

您需要创建一个 Runnable 并在 UI 线程上运行它,或者像执行其他 UI 元素一样在 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;
    }

【讨论】:

  • 能否提供源代码
  • 我进行了编辑 - 还有其他方法,这只是一个示例。我可能会像这里显示的那样设置错误文本,然后将错误消息更新放在 onPostExecute 中,但我认为这是一个更有用的示例
  • Y 它的工作非常感谢,你能不能用例子解释一下如何在 onPostExecute 中更新错误消息,我也想学习一下。
  • 我想在我的项目中做的另一件事是,在我的 loginActivity 中,当我输入错误的用户名和密码时,进度对话框也会执行我想停止我只想显示进度对话框时这是有效的用户是否可以这样做..
  • 如果你把这行loginErrorMsg.setText(errorText); 放在onPostExecute 中并去掉Runnable,它也可以工作...
【解决方案2】:

您不能在TextView 内部doInBackground 上调用setText,一旦任务完成执行,您应该在onPostExecute 内部更新您的 UI,或者在任务执行期间使用线程来更改 UI(不推荐)。

如果需要显示进度,可以使用onProgressUpdatepublishProgress

【讨论】:

  • 能否提供源代码
  • 您可能需要重新处理整个任务,以便解析 doInBackground 中的整个 JSON,然后然后使用生成的数据来更新您的 UI、启动新的活动等...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2015-03-01
相关资源
最近更新 更多