只有创建一个视图层次可以触摸其观点错误原来的线程 [英] Only the original thread that created a view hierarchy can touch its views ERROR

查看:283
本文介绍了只有创建一个视图层次可以触摸其观点错误原来的线程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一切正常,除了当它到达到的code的最后一部分注册成功!然后如上述在标题中的错误出现registerDialog消息部分内

任何即时做错误?谁能帮我查一下我的code

非常感谢你。

该应用程序并没有崩溃,虽然它只是退回到应用程序主页。如果我preSS的注册按钮再次它会返回一个同样的错误。

  

私人无效setRegister(键b){           b.setOnClickListener(新View.OnClickListener(){

 私人的AsyncTask<字符串,太虚,字符串> TASK2;

        公共无效的onClick(视图v){
            // TODO自动生成方法存根
            registerDialog =新AlertDialog.Builder(Login.this).create();
            registerDialog.setTitle(注册警报!);
            registerDialog.setButton(DialogInterface.BUTTON_NEGATIVE,后退,新DialogInterface.OnClickListener(){

                        公共无效的onClick(DialogInterface对话,诠释它){
                            // TODO自动生成方法存根
                            registerDialog.dismiss();
                        }
                    });

            TASK2 =新的AsyncTask<字符串,太虚,字符串>(){

                ProgressDialog dialog2;
                ArrayList的<的NameValuePair> postParameters2;
                字符串响应2 = NULL;

                    @覆盖
                    在preExecute保护无效(){
                        postParameters2 =新的ArrayList<的NameValuePair>();
                        postParameters2.add(新BasicNameValuePair(usernamelog,rUsername.getText()的toString())。);
                        postParameters2.add(新BasicNameValuePair(passwordlog,rPassword.getText()的toString()));
                        postParameters2.add(新BasicNameValuePair(rpasswordlog,rRpassword.getText()的toString())。);
                        postParameters2.add(新BasicNameValuePair(emaillog,rEmail.getText()的toString())。);
                        postParameters2.add(新BasicNameValuePair(phonenumlog,rPhoneNum.getText()的toString())。);
                        postParameters2.add(新BasicNameValuePair(doblog,rBirthday.getText()的toString())。);
                        postParameters2.add(新BasicNameValuePair(genderlog,rGender.getText()的toString()与toUpperCase(Locale.ENGLISH))。。);

                        dialog2 =新ProgressDialog(Login.this,ProgressDialog.STYLE_SPINNER);
                        dialog2.setMessage(注册...);

                        dialog2.show();
                    }

                    @覆盖
                    保护字符串doInBackground(字符串... PARAMS){
                        尝试 {
                            响应2 = CustomHttpClient.executeHttpPost(http://whatstherex.info/checkR.php,postParameters2);

                            串RES2 = response2.toString();

                            RES2 = res2.replaceAll(空,);

                            如果(res2.equals(1)){
                                RES2 =注册成功!;
                                rAuth.setTextColor(Color.GREEN);
                                返回RES2;
                            } 其他 {
                                RES2 = res2.toString();
                                rAuth.setTextColor(Color.RED);
                                返回RES2;
                            }
                        }赶上(例外五){
                            RES2 = e.toString();
                            rAuth.setTextColor(Color.BLACK);
                            返回RES2;
                        }
                    }

                    @覆盖
                    保护无效onPostExecute(字符串结果2){
                        如果(result2.equals(注册成功!)及!&安培;!result2.equals(用户名必须至少为5个字符)及和放大器;!result2.equals(密码必须至少为8字符)及和放大器;!result2.equals(密码不匹配)及和放大器;!result2.equals(电子邮件字段为空)及和放大器;!result2.equals(电子邮件字段是无效的)及和放大器;!result2.equals(电话号码字段为空)及和放大器;!result2.equals(电话号码是不是数字)及和放大器;!result2.equals(电话号码不8位)及和放大器;!result2.equals(生日字段为空)及和放大器;!result2.equals(生日不是数字)及和放大器;!result2.equals(生日不在DDMMYYYY格式)及和放大器;!result2.equals(性别字段为空)及和放大器;!result2.equals(性别字段无效)及和放大器; result2.equals(!在性别不格式M或F)及和放大器;!result2.equals(重复的条目。+ rUsername.getText()的toString()+'关键'用户名)及和放大器;!result2.equals(重复条目'+ rEmail.getText()的toString()+。关键电子邮件)及和放大器; !result2.equals(重复项+ rPhoneNum.getText()。的toString()+'关键'PHONENUM)){
                        rAuth.setText(未知错误!);
                        rAuth.setTextColor(Color.BLUE);
                        registerDialog.setMessage(结果2);
                        registerDialog.show();
                        dialog2.dismiss();
                        }否则,如果(result2.equals(重复项+ rUsername.getText()。的toString()+'关键'用户名)){
                            rAuth.setText(用户名已经在使用);
                            rAuth.setTextColor(Color.RED);
                            registerDialog.setMessage(用户名已经在使用);
                            registerDialog.show();
                            dialog2.dismiss();
                        }否则,如果(result2.equals(重复项+ rEmail.getText()。的toString()+关键电子邮件)){
                            rAuth.setText(电子邮件已在使用);
                            rAuth.setTextColor(Color.RED);
                            registerDialog.setMessage(电子邮件已在使用);
                            registerDialog.show();
                            dialog2.dismiss();
                        }否则,如果(result2.equals(重复项+ rPhoneNum.getText()。的toString()+'关键'PHONENUM)){
                            rAuth.setText(手机已经在使用的号码);
                            rAuth.setTextColor(Color.RED);
                            registerDialog.setMessage(手机已经在使用的号码);
                            registerDialog.show();
                            dialog2.dismiss();
                        }其他 {
                            rAuth.setText(注册成功!);
                            rAuth.setTextColor(Color.GREEN);
                            registerDialog.setMessage(注册成功!);
                            registerDialog.show();
                            dialog2.dismiss();
                        }
                    }

            };
            task2.execute();
        }
    });
}
 

解决方案

我猜 rAuth 的TextView 。这需要移动到 onPostExecute(),你将无法更新 UI 元素中的 doInBackground()。只有 onPostExecute() onProgressUpdate()在preExecute() UI 线程上运行。

这里是链接到文档

Everything works except when it reaches till the last part of the code with "Successfully Registered!" then the error as mentioned in the title appears inside the registerDialog message part.

Anything im doing wrongly? can anyone help me check up my code

Thank you very much.

The app didn't crash though it just exit back to the app main page. and if i press the register button again it will return with the same error.

private void setRegister(Button b) { b.setOnClickListener(new View.OnClickListener() {

        private AsyncTask<String, Void, String> task2;

        public void onClick(View v) {
            // TODO Auto-generated method stub
            registerDialog = new AlertDialog.Builder(Login.this).create();
            registerDialog.setTitle("Register Alert!");
            registerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Back", new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                            registerDialog.dismiss();
                        }
                    });

            task2 = new AsyncTask<String, Void, String>() {

                ProgressDialog dialog2;
                ArrayList<NameValuePair> postParameters2;
                String response2 = null;

                    @Override
                    protected void onPreExecute() {
                        postParameters2 = new ArrayList<NameValuePair>();
                        postParameters2.add(new BasicNameValuePair("usernamelog", rUsername.getText().toString()));
                        postParameters2.add(new BasicNameValuePair("passwordlog", rPassword.getText().toString()));
                        postParameters2.add(new BasicNameValuePair("rpasswordlog", rRpassword.getText().toString()));
                        postParameters2.add(new BasicNameValuePair("emaillog", rEmail.getText().toString()));
                        postParameters2.add(new BasicNameValuePair("phonenumlog", rPhoneNum.getText().toString()));
                        postParameters2.add(new BasicNameValuePair("doblog", rBirthday.getText().toString()));
                        postParameters2.add(new BasicNameValuePair("genderlog", rGender.getText().toString().toUpperCase(Locale.ENGLISH)));                 

                        dialog2 = new ProgressDialog(Login.this, ProgressDialog.STYLE_SPINNER);
                        dialog2.setMessage("Registering...");       

                        dialog2.show();
                    }

                    @Override
                    protected String doInBackground(String... params) {
                        try {
                            response2 = CustomHttpClient.executeHttpPost("http://whatstherex.info/checkR.php", postParameters2);

                            String res2 = response2.toString();

                            res2 = res2.replaceAll("null", "");

                            if (res2.equals("1")) {
                                res2 = "Successfully Registered!";
                                rAuth.setTextColor(Color.GREEN);
                                return res2;
                            } else {
                                res2 = res2.toString();
                                rAuth.setTextColor(Color.RED);
                                return res2;
                            }
                        } catch (Exception e) {
                            res2 = e.toString();
                            rAuth.setTextColor(Color.BLACK);
                            return res2;
                        }
                    }

                    @Override
                    protected void onPostExecute(String result2) {
                        if(!result2.equals("Successfully Registered!") && !result2.equals("Username have to be at least 5 characters") && !result2.equals("Password have to be at least 8 characters") && !result2.equals("Passwords does not match") && !result2.equals("Email field is empty") && !result2.equals("Email field is not valid") && !result2.equals("Phone number Field is empty") && !result2.equals("Phone number is not numeric") && !result2.equals("Phone number is not 8 digit") && !result2.equals("Birthday Field is empty") && !result2.equals("Birthday is not numeric") && !result2.equals("Birthday is not in DDMMYYYY format") && !result2.equals("Gender Field is empty") && !result2.equals("Gender Field is invalid") && !result2.equals("Gender not in the format M or F") && !result2.equals("Duplicate entry '"+rUsername.getText().toString()+"' for key 'username'") && !result2.equals("Duplicate entry '"+rEmail.getText().toString()+"' for key 'email'") && !result2.equals("Duplicate entry '"+rPhoneNum.getText().toString()+"' for key 'phoneNum'")){
                        rAuth.setText("Unknown Error!!!");
                        rAuth.setTextColor(Color.BLUE);
                        registerDialog.setMessage(result2);
                        registerDialog.show();
                        dialog2.dismiss();
                        }else if (result2.equals("Duplicate entry '"+rUsername.getText().toString()+"' for key 'username'")) {
                            rAuth.setText("Username already in used");
                            rAuth.setTextColor(Color.RED);
                            registerDialog.setMessage("Username already in used");
                            registerDialog.show();
                            dialog2.dismiss();
                        }else if (result2.equals("Duplicate entry '"+rEmail.getText().toString()+"' for key 'email'")) {
                            rAuth.setText("Email already in used");
                            rAuth.setTextColor(Color.RED);
                            registerDialog.setMessage("Email already in used");
                            registerDialog.show();
                            dialog2.dismiss();
                        }else if (result2.equals("Duplicate entry '"+rPhoneNum.getText().toString()+"' for key 'phoneNum'")){
                            rAuth.setText("Phone number already in used");
                            rAuth.setTextColor(Color.RED);
                            registerDialog.setMessage("Phone number already in used");
                            registerDialog.show();
                            dialog2.dismiss();
                        }else {
                            rAuth.setText("Successfully Registered!");
                            rAuth.setTextColor(Color.GREEN);
                            registerDialog.setMessage("Successfully Registered!");
                            registerDialog.show();
                            dialog2.dismiss();
                        }
                    }

            };
            task2.execute();                                    
        }
    });         
}

解决方案

I'm guessing that rAuth is a TextView. This needs to be moved to the onPostExecute() as you can't update UI elements in the doInBackground(). Only the onPostExecute(), onProgressUpdate() and onPreExecute() run on the UI thread.

Here is Link to Docs

这篇关于只有创建一个视图层次可以触摸其观点错误原来的线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆