如何在Android中暂停/睡眠线程或进程?

2024-03-11

我想在两行代码之间暂停一下,让我解释一下:

-> 用户单击一个按钮(实际上是一张卡片),我通过更改该按钮的背景来显示它:

thisbutton.setBackgroundResource(R.drawable.icon);

-> 假设 1 秒后,我需要通过更改背景来返回到按钮之前的状态:

thisbutton.setBackgroundResource(R.drawable.defaultcard);

-> 我尝试使用以下方法暂停这两行代码之间的线程:

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

然而,这是行不通的。也许我需要暂停的是进程而不是线程?

我也尝试过(但不起作用):

new Reminder(5);

有了这个:

public class Reminder {

Timer timer;

        public Reminder(int seconds) {
            timer = new Timer();
            timer.schedule(new RemindTask(), seconds*1000);
        }

        class RemindTask extends TimerTask {
            public void run() {
                System.out.format("Time's up!%n");
                timer.cancel(); //Terminate the timer thread
            }
        }  
    }

如何暂停/睡眠线程或进程?


解决此问题的一种方法是使用Handler.postDelayed() http://developer.android.com/reference/android/os/Handler.html方法。一些谷歌培训教材 https://cswithandroid.withgoogle.com/lesson-plans/facilitator-guide.html建议相同的解决方案。

@Override
public void onClick(View v) {
    my_button.setBackgroundResource(R.drawable.icon);

    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {
         @Override 
         public void run() { 
              my_button.setBackgroundResource(R.drawable.defaultcard); 
         } 
    }, 2000); 
}

然而,有些人指出上述解决方案导致内存泄漏 http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html因为它使用非静态内部匿名类,该类隐式保存对其外部类(即活动)的引用。当活动上下文被垃圾收集时,这是一个问题。

避免内存泄漏的更复杂的解决方案是子类化Handler and Runnable在活动中使用静态内部类,因为静态内部类不持有对其外部类的隐式引用:

private static class MyHandler extends Handler {}
private final MyHandler mHandler = new MyHandler();

public static class MyRunnable implements Runnable {
    private final WeakReference<Activity> mActivity;

    public MyRunnable(Activity activity) {
        mActivity = new WeakReference<>(activity);
    }

    @Override
    public void run() {
        Activity activity = mActivity.get();
        if (activity != null) {
            Button btn = (Button) activity.findViewById(R.id.button);
            btn.setBackgroundResource(R.drawable.defaultcard);
        }
    }
}

private MyRunnable mRunnable = new MyRunnable(this);

public void onClick(View view) {
    my_button.setBackgroundResource(R.drawable.icon);

    // Execute the Runnable in 2 seconds
    mHandler.postDelayed(mRunnable, 2000);
}

请注意,Runnable uses a 弱引用 https://developer.android.com/reference/java/lang/ref/WeakReference.html到 Activity,这在需要访问 UI 的静态类中是必需的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Android中暂停/睡眠线程或进程? 的相关文章

  • 多线程环境下如何更好的使用ExecutorService?

    我需要创建一个库 其中包含同步和异步方法 executeSynchronous 等待直到有结果 返回结果 executeAsynchronous 立即返回一个 Future 如果需要 可以在其他事情完成后进行处理 我的图书馆的核心逻辑 客户
  • JavaFX Platform.runLater 的使用以及从不同线程访问 UI

    我有几个问题Platform runLater 我有一个 JavaFX 应用程序类 在这个类中 我运行一个线程 该线程从网络套接字读取数据 现在当我创建一个新的Stage在线程内部 系统抛出异常 JavaFX 事件调度程序线程和我的网络读取
  • 自定义视图的Ondraw无限循环android

    我的自定义视图的 OnDraw 函数被无限调用并且正在循环 可能的原因是什么 这是我的自定义视图 public class Balls extends View private static final String TAG BallsVi
  • 对齐卡片视图中的项目

    我希望我的卡片如下所示 我保持这样的布局
  • 从创建 UI 的同一线程更新 VCL。为什么?

    我知道我必须调用 Synchronize 来从未创建控件或向窗口发送消息的线程更新 vcl 我经常听到 线程不安全 这个词 但我找不到关于正在发生的事情的实际解释 我知道应用程序可能会因访问冲突而崩溃 但我又不知道为什么 请阐明这个主题 V
  • 使用 Gradle 进行 Travis-CI Android 测试总是超时

    我正在尝试在 Travis CI 上构建和测试我的项目 它每次都会在我的所有存储库上向我显示相同的重复输出 这是我的 travis ymlhttps github com carts uiet cartsbusboarding blob m
  • 屏幕滚动时 GridView 内的项目会重复

    我使用 GridView 来显示一组用户可以选择的类别 网格的每个项目都由一个 ImageView 和一个 TextView 组成 两者都是从服务器检索的 当触摸一个项目时 另一个活动就会启动 我以为一切都很顺利 直到我注意到当我滚动屏幕时
  • EditText 中的双光标用于输入类型号码/电话(RTL 阿拉伯语)

    我将 EditText 设置为 重力右 以便如果语言是阿拉伯语 则文本从右侧开始 注意 我的应用程序支持 RTL 并且我没有为 EditText 设置 TextDirection 因为这会出现相同的问题 将重力设置为 右 可以完美完成这项工
  • Java 唤醒休眠线程

    我阅读了其他帖子 但没有找到我正在寻找的确切答案 所以我希望有人能给出一些澄清 我有一个将运行一段时间的程序 我有一些在后台运行的线程来执行各种任务 为了简单起见 让我们考虑 3 个线程 ThreadA每 10 秒执行一次任务 其中Thre
  • 在 Marshmallow 中获取蓝牙本地 mac 地址

    在 Marshmallow 之前 我的应用程序将通过以下方式获取其设备 MAC 地址BluetoothAdapter getDefaultAdapter getAddress 现在 随着 Marshmallow Android 的回归02
  • Flutter - 选择 TextFormField 时键盘不显示

    我目前遇到一个问题 当我选择任何一个时 键盘不会出现TextFormFielda 内的小部件Form小部件 这是表单的代码 位于我的内部CreateAccountForm有状态的小部件 import package flutter mate
  • 输入连接-如何删除选定的文本?

    我为 Android 制作了一个自定义键盘 当我按下键盘的退格按钮时 我使用 getCurrentInputConnection deleteSurroundingText 1 0 从输入字段中删除一个字母 但是 当我选择一些文本然后按退格
  • 无法通过 Android 应用程序访问我的笔记本电脑的本地主机

    因此 我在发布此内容之前做了一项研究 我发现的解决方案不起作用 更准确地说 连接到我的笔记本电脑的 IPv4192 168 XXX XXX 没用 连接到10 0 2 2 加上端口 不起作用 我需要测试使用 Django Rest 框架构建的
  • 方向改变时的类转换异常 (Android)

    我有一个由选项卡活动托管的活动 当我更改屏幕方向时 我的应用程序崩溃了 02 14 21 01 35 825 E AndroidRuntime 9424 java lang RuntimeException Unable to start
  • Android 中的垂直和水平滚动视图

    我真的很累了寻找垂直和水平滚动视图的解决方案 我读到框架中没有任何视图 布局实现此功能 但我需要这样的东西 我需要在其他布局中定义一个布局 子布局必须实现垂直 水平滚动才能移动 最初实现了一个逐像素移动布局的代码 但我认为这不是正确的方法
  • jQuery mobile - 仅在侧面板关闭时才允许滚动?

    我不希望用户在任何侧边栏打开时滚动 一旦关闭 他们应该滚动 我使用了下面的代码 但它不适用于 Android 移动设备 document bind panelopen function e data body css overflow hi
  • Phonegap facebook 插件:android 的各种问题

    我正在尝试将 Phonegap 3 1 与 Phonegap facebook plugin 集成 以使我的应用程序能够使用 facebook 登录 https github com phonegap phonegap facebook p
  • 停止前台运行的服务的正确方法是什么

    我正在尝试停止作为前台服务运行的服务 当前的问题是当我打电话时stopService 通知仍然保留 因此 在我的解决方案中 我添加了一个接收器 我正在将其注册到onCreate 在 的里面onReceive 我调用的方法stopforegr
  • 读/写带有特殊字符的.txt文件

    I open Notepad Windows 并写 Some lines with special characters Special 并前往另存为 someFile txt 与Encoding set to UTF 8 在Java中我有
  • Scrum:太多还是不够? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的公司最近开始使用Scrum 我们已经完成了 2 次冲刺 我们仍在学习 但我们确实已经暴露并修复了开发过程中的一些问题 所以总的来说 我

随机推荐

  • 与表无关的外键?

    首先 我确实读过这个 StackOverflow 问题 https stackoverflow com questions 294969 sql one foreign key references primary key in one o
  • PKCS12 到 JKS 转换失败

    我正在尝试使用以下命令将 PKCS12 格式文件转换为 JKS 密钥库 keytool v importkeystore trustcacerts srckeystore cert p12 srcstoretype PKCS12 destk
  • emacs isearch 整个缓冲区的延迟突出显示

    isearch 的默认行为是突出显示当前窗口中匹配的世界 我怎样才能改变这种行为 让它突出显示整个当前缓冲区中匹配的世界 也许您正在寻找高亮 命令 以便在执行其他操作时在整个缓冲区中突出显示内容 M shC h lists Global B
  • KeyListener 在 JPanel 中不起作用?

    我正在尝试在 java 类中使用 KeyListener 但由于某些奇怪的原因它不接受输入 我最近刚刚遇到这个问题 在它运行完美之前 但发生了一些变化 现在它不接受任何输入 这是我的代码的摘录 public class SquarePane
  • 嵌套文档 MongoDB 中的求和

    我试图对一系列文档中的一些值求和 但没有成功 这是文件 db Cuentas find pretty Agno 2013 Egresos Fecha 28 01 2013 Monto 150000 Detalle Pago Nokia Lu
  • 在 Microsoft Excel 中将值向上舍入到最低值

    我正在 Excel 中编写一个公式 其中我要潜水 2 个数字 并且我不需要十进制值 我尝试使用 ROUND 5 10 0 但它的舍入范围为 0 5 到 1 但我的要求是 0 0 99 应该评估为0 同样 2 2 990 应评估为 2 E g
  • android RadioButton按钮可绘制重力

    我正在动态生成 RadioButtons RadioButton radioButton new RadioButton context LayoutParams layoutParams new LayoutParams radioWid
  • 使用函数的返回类型指定类型提示

    我想将变量的类型暗示为特定函数的返回类型 无需手动指定函数的返回类型是什么 我无法以可用作另一个变量提示的方式从函数中提取返回值类型 def dostuff gt T StuffContainer namedtuple StuffConta
  • 为什么 SortedList.add() 会抛出 UnsupportedOperationException?

    非常简单的代码 import javafx collections FXCollections import javafx collections ObservableList import javafx collections trans
  • 在 Firebase 中的 SafetyNet 的应用程序检查中取消注册应用程序

    我已在 firebase 控制台中的应用程序检查中的 safetyNet 中注册了应用程序 但是现在我必须取消注册 将应用程序添加到 safetyNet 中或禁用 safetyNet 我该怎么做 这有点棘手且不直观 因为您无法删除产品设置中
  • 在 Laravel 中使用同步在数据透视表中分离

    我发生了一些奇怪的事情 我无法理解 想知道是否有人可以帮助我弄清楚发生了什么事 我有 2 个表 评估者 流程 和一个数据透视表 process assessor 我正在尝试使用评估者的流程更新数据透视表 因此我有一个表单 在提交时会传递给此
  • Devise for Rails 4:为什么要将用户配置文件数据保存在与 Devise 用户模型表不同的单独表中

    我正在使用 devise 根据文档建议 我有一个用户模型 用于 devise 和一个用于用户数据 例如姓名 工作等 的配置文件模型 为什么仅将所有这些属性存储在设计用户模型表 只是好奇 如果 gem 更改了表定义 则向外部源指定的表添加字段
  • URL 缩短工具如何保证 URL 不会过期? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 stackoverflow 上以及互联网上的其他地方都有很多关于 URL 缩短器的问题 例如 如何编写 URL 缩短器代码 https stackov
  • 本地删除文件后SVN提交错误

    我有一个使用 Netbeans 6 1 构建的项目 并且使用 SVN 我删除了本地计算机上的一些文件 然后尝试将更改提交到 SVN 存储库 提交失败并显示错误消息 C path to project myfile 的条目没有 URL 其中
  • 自定义clickonce下载屏幕

    众所周知 当我们双击 clickonce 安装的应用程序时 会弹出一个 clickonce 屏幕 显示 正在验证系统要求 然后 如果服务器中有更新的版本 则单击更新本地安装的版本 并启动应用程序 有什么方法可以定制整个过程 这并不意味着我想
  • Backbone.js:未到达路由器回调

    我在获取简单的应用程序示例进行路由时遇到问题 我正在使用backbone on rails gem 这是我的 App js coffee window App Models Collections Views Routers documen
  • 使用 Autodesk API 下载文档

    我正在尝试从 BIM 360 Docs 下载文档 如果我想下载类型为 type items autodesk bim360 File 我只需要获取bucketID和objectID projects
  • 如何更改特定类名的所有类名元素

    如何更改特定类名的所有类名元素 我的意思是 假设我有 3 个带有 MyClass 类的 div 我想在 JavaScript 中将它们的类名更改为 notMyClass 该怎么做 div class MyClass div div clas
  • Java 8 是否提供了访问者模式的替代方案?

    This https stackoverflow com questions 2078978 functional programming vs object oriented programming 2079678 2079678Stac
  • 如何在Android中暂停/睡眠线程或进程?

    我想在两行代码之间暂停一下 让我解释一下 gt 用户单击一个按钮 实际上是一张卡片 我通过更改该按钮的背景来显示它 thisbutton setBackgroundResource R drawable icon gt 假设 1 秒后 我需