android操作ui线程

举报
风吹稻花香 发表于 2021/06/05 23:53:30 2021/06/05
【摘要】   runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "网络请求失败", Toast.LENGTH_SHORT).show(); final Timer t = new Timer(); t.schedule(new T...

 


  
  1. runOnUiThread(new Runnable() {
  2. @Override
  3. public void run() {
  4. Toast.makeText(MainActivity.this, "网络请求失败", Toast.LENGTH_SHORT).show();
  5. final Timer t = new Timer();
  6. t.schedule(new TimerTask() {
  7. public void run() {
  8. nebulaOk = 2; // 这里将状态置为2是必要的以防再请求失败时状态没有更改过来造成的不发送nebula请求
  9. t.cancel();
  10. }
  11. }, 1000);
  12. }
  13. });

 

  我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据。但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的。下面总结4中方法用来在线程中操作UI界面。

  模拟耗时操作

 

private void connectNet() throws InterruptedException { Thread.sleep(2000); }

  方法一:Handler

子线程中通过Handler的sendMessage(msg)发送事件:

 

private void method1() { new Thread(new Runnable() { @Override public void run() { try { //耗时操作 connectNet(); //向Handler发送消息 mHadndler.sendEmptyMessage(111); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); }

  方法二:View.post(Runnable)

 

private void method2() { myText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { try { //耗时操作 connectNet(); myText.post(new Runnable() { @Override public void run() { myText.setText("联网结束,更新UI数据"); } }); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }); }

  方法三:Activity.runOnUiThread

与view.post类似

 

private void method3() { new Thread(new Runnable() { @Override public void run() { try { //耗时操作 connectNet(); runOnUiThread(new Runnable() { @Override public void run() { myText.setText("runOnUiThread..."); } }); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); }

    方法四:AsyncTask

 

private void method4() { //UI线程中执行 new LoadTask().execute("www.91dota.com"); } private class LoadTask extends AsyncTask { protected void onPostExecute(String result) { myText.setText(result); //得到来自网络的信息刷新页面 } protected String doInBackground(Object[] objects) { return "......";//后台耗时操作 } }

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/103336149

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。