java-如何使用run runOnUithread?

java-如何使用run runOnUithread?,第1张

概述我正在使用的应用程序具有登录/注册,该登录/注册连接到mysql数据库.起初,我在UI线程上运行了所有程序,后来发现由于在Android的UI线程上运行较长的代码而无法正常工作.我试图编辑我的代码以在添加的新线程上运行长任务..现在我的应用程序注册了我在mysql中看到的结果,但是由于这个

我正在使用的应用程序具有登录/注册,该登录/注册连接到mysql数据库.起初,我在UI线程上运行了所有程序,后来发现由于在Android的UI线程上运行较长的代码而无法正常工作.我试图编辑我的代码以在添加的新线程上运行长任务.
.现在我的应用程序注册了我在MysqL中看到的结果,但是由于这个错误,我的应用程序一直关闭

androID.vIEw.VIEwRootImpl$CalledFromWrongThreadException: Only the original thread that created a vIEw hIErarchy can touch its vIEws.

该错误是可以理解的,但我不知道如何将一个或多个VIEw运行回UI线程.

我已经对runOnuithread进行了一些研究,但是我不知道将其放置在代码中的位置,或者天气我将之前添加的新线程放在错误的位置开始,请

谁能帮我解决这个问题

这是代码片段

public voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.register);    // importing all assets like buttons, text fIElds    inputFullname = (EditText) findVIEwByID(R.ID.registername);    inputEmail = (EditText) findVIEwByID(R.ID.registerEmail);    inputPassword = (EditText) findVIEwByID(R.ID.registerPassword);    btnRegister = (button) findVIEwByID(R.ID.btnRegister);    btnlinkTologin = (button) findVIEwByID(R.ID.btnlinkTologinScreen);    registerErrorMsg = (TextVIEw) findVIEwByID(R.ID.register_error);    // Register button Click event    btnRegister.setonClickListener(new VIEw.OnClickListener() {          public voID onClick(VIEw vIEw) {             /** According with the new StrictGuard policy,  running long tasks on the Main UI thread is not possible            So creating new thread to create and execute http operations */            new Thread (new Runnable() {                @OverrIDe                 public voID run() {            //            String name = inputFullname.getText().toString();            String email = inputEmail.getText().toString();            String password = inputPassword.getText().toString();            UserFunctions userFunction = new UserFunctions();            JsONObject Json = userFunction.registerUser(name, email, password);            // check for login response            try {                //                //                if (Json.getString(KEY_SUCCESS) != null) {                    registerErrorMsg.setText("");                    String res = Json.getString(KEY_SUCCESS);                     if(Integer.parseInt(res) == 1){                        // user successfully registred                        // Store user details in sqlite Database                        DatabaseHandler db = new DatabaseHandler(getApplicationContext());                        JsONObject Json_user = Json.getJsONObject("user");                        // Clear all prevIoUs data in database                        userFunction.logoutUser(getApplicationContext());                        db.addUser(Json_user.getString(KEY_name), Json_user.getString(KEY_EMAIL), Json.getString(KEY_UID), Json_user.getString(KEY_CREATED_AT));                                                // Launch Dashboard Screen                        Intent dashboard = new Intent(getApplicationContext(), MainActivity.class);                        // Close all vIEws before launching Dashboard                        dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_top);                        startActivity(dashboard);                        // Close Registration Screen                        finish();                    }else{                        // Error in registration                        registerErrorMsg.setText("Error occured in registration");                    }                }//            } catch (JsONException e) {                e.printstacktrace();            }        }            }).start();        }    });    // link to Login Screen    btnlinkTologin.setonClickListener(new VIEw.OnClickListener() {        public voID onClick(VIEw vIEw) {            Intent i = new Intent(getApplicationContext(),                    LoginActivity.class);            startActivity(i);            // Close Registration VIEw            finish();        }    });}}

解决方法:

由于您似乎将网络代码与UI代码混合在一起,因此我不会尝试为您编写代码.我可以告诉您应该怎么做,并假定您可以自己重新排列代码,因为您知道代码的全部功能.

好的,在run()中放入网络代码,然后在需要更新UI时可以

runOnUiThread(new Runnable(){    @OverrIDe    public voID run()    {        // code to update UI    }});

话虽如此,我建议您将AsyncTask用于网络 *** 作.由于它已经具有用于后台内容和更新UI的功能,因此这变得更加容易.您启动任务并运行doInBackground(),这就是您执行所有网络 *** 作的地方.然后,您可以使用AsyncTasks其他3种方法中的任何一种来更新UI.

See this answer是使用AsyncTask的示例,以及指向上述文档的链接.

总结

以上是内存溢出为你收集整理的java-如何使用run runOnUithread?全部内容,希望文章能够帮你解决java-如何使用run runOnUithread?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1095405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存