当前位置: 首页 > 知识库问答 >
问题:

与Thread模式混淆

燕永昌
2023-03-14

这可能看起来是一个非常有趣和愚蠢的问题。。

我试着在Android应用程序中使用可运行程序、线程、服务和意向服务来查看后台操作。

所以我创建了一个活动,并在活动中创建了一个简单的线程,比如,

public class ExectuableThread implements Runnable{
  @Override
  public void run() {
    Log.e("current-thread", String.valueOf(Looper.getMainLooper().isCurrentThread())); // **Returning true**
    btnDone.setText("will not work");
  }
}

因此,在上述场景中,按钮文本正在发生变化。

没关系,我打电话是这样的:

Thread t = new Thread (new ExectuableThread());
t.run();

Thread t = new Thread (new ExectuableThread());
t.start();

为什么我的按钮文本通过调用start()而改变-何时使用背景线程?

现在是一个非常有趣的场景;如果我延迟2秒,就像这样;

public class ExectuableThread implements Runnable{
  @Override
  public void run() {
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    Log.e("current-thread", String.valueOf(Looper.getMainLooper().isCurrentThread()));
    btnDone.setText("will not work");
  }
}

如果调用start(),则视图不会得到更新;在run()调用情况下。它会起作用的。

start()和run()之间的区别很明显,但问题是相同的,如果线程在后台,为什么按钮文本会更新。

共有2个答案

毛景曜
2023-03-14

主要区别在于,当程序调用start()方法时,将创建一个新线程,并在新线程中执行run()方法,而如果直接调用run()方法,则不会创建新线程,run()中的代码将在当前线程中执行。

第二个区别是,如果两次调用start()方法,它将抛出IllegalStateException

韩涵衍
2023-03-14

首先,你的名字不太好:

public class ExectuableThread implements Runnable {

会暗示这个类的实例是线程,但它们当然不是。所以你给整个问题增加了混乱。

我的问题是为什么我的按钮文本正在改变,如果通过调用start();线程在后台运行。

事情是:当你不按照“正确的方式”做事时,尤其是在多线程中,各种各样的事情都可能发生。

意思:为了在Android中更新UI元素,你应该使用runOnUiThread。在其他线程中更新UI元素可能有效,也可能无效。

 类似资料:
  • 我正在尝试复制混合模式。目前我已经重新创建了一个屏幕混合模式,但它似乎不能很好地工作与透明图像。 我有两种纹理 图1(前景) 图片2(背景) 我得到的结果是 计算机着色器代码 我如何将图像与不同的阿尔法正确地混合在一起?

  • Android/H5混合试验过程 在创建和编辑试验时,建议使用Chrome浏览器,以达到最佳体验。 在这部分中,我们将以优化页面上的一个标题的文案,预期提升转化为例,来说明如何使用编程模式试验。先通过一张简单的流程图了解所需的步骤,再一步步进行具体操作: 1 试验方案 一个完整的A/B 测试需要根据目前已有的用户数据进行分析判断,推断并建立假设,才能针对性的做出改变和调整,根据具体需求,构建产品A

  • iOS/H5混合编程试验过程 在创建和编辑试验时,建议使用Chrome浏览器,以达到最佳体验。 在这部分中,我们将以优化页面上的一个标题的文案,预期提升转化为例,来说明如何使用编程模式试验。先通过一张简单的流程图了解所需的步骤,再一步步进行具体操作: 1 试验方案 一个完整的A/B 测试需要根据目前已有的用户数据进行分析判断,推断并建立假设,才能针对性的做出改变和调整,根据具体需求,构建产品A/B

  • 本文向大家介绍java多线程Thread-per-Message模式详解,包括了java多线程Thread-per-Message模式详解的使用技巧和注意事项,需要的朋友参考一下 Thread-per-Message模式(这项工作就交给你了) 当你很忙碌的时候,这个时候公司楼下有个快递,于是你委托你的同事帮你拿一下你的快递,这样你就可以继续做自己的工作了 在Thread-Per-Message模式

  • 选项栏中指定的混合模式控制图像中的像素如何受绘画或编辑工具的影响。在显示混合模式的效果时,请依据以下几种颜色: 基色是原始图像颜色。 混合色是通过绘画或编辑工具应用的颜色。 结果色是混合后得到的颜色。 混合模式说明 从选项栏的“模式”弹出式菜单中进行选取。 注意: 在“混合模式”弹出菜单中,滚动查看各个选项,以了解它们在图像上的外观效果。Photoshop 会在画布上显示混合模式的实时预览效果。

  • 关于透明度 透明度极其密切地集成在 Illustrator 之中,您很可能在不知不觉间,就在图稿上加了透明度。您可以通过下列任意一种操作在图稿中添加透明度: 降低对象的不透明度,以使底层的图稿变得可见。 使用不透明蒙版来创建不同的透明度。 使用混合模式来更改重叠对象之间颜色的相互影响方式。 应用包含透明度的渐变和网格。 应用包含透明度的效果或图形样式,例如投影。 •导入包含透明度的 Adobe P