我正在使用的应用程序具有登录/注册,该登录/注册连接到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?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)