如何在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中暂停/睡眠线程或进程? 的相关文章

  • 如何使用gradle这样的格式更改apk名称?

    当我使用 gradle 构建应用程序时 我想将 app release apk 文件名更改为如下所示 format appname of package name V version code yyMMdd R T explain appn
  • 在Android内存中存储gif图像

    我对安卓还很陌生 我想将图像保存到内存中 然后从内存中检索图像并将其加载到图像视图中 我已使用以下代码成功将图像存储在内存中 void saveImage String fileName img cnt jpg File file new
  • Android浏览器上的Web应用程序宽度问题

    所以到目前为止我只在 Android 浏览器上遇到过这个问题 基本上我的网站几乎一直运行良好 而且我还没有在 Dolphin Opera 或 Skyfire 上看到这个问题 但偶尔当我从手机主屏幕之一上的书签重新打开 Android 浏览器
  • Android中如何将文件写入raw文件夹?

    我认为这是一个非常基本的问题 我目前正在编写这样的文件 File output new File exampleout mid 现在 我想将文件写入 myproject res raw 我读到我可以通过将完整的网址放在 中来做到这一点 但
  • 通过我的应用程序以编程方式插入新联系人,而不使用 Intent

    我正在使用一个应用程序 与手机联系人进行交互 我想将新联系人添加到我的手机联系人列表中 我已经尝试过以下代码 但它不起作用 void addContact Context ctx PreviewContactModel model Arra
  • 如何停止提交给 ExecutorService 的 Callable?

    我正在尝试实现一个示例应用程序来测试Callable and ExecutorService接口 在我的应用程序中我已经声明 ExecutorService exSvc Executors newSingleThreadExecutor T
  • Android Accessibility 执行触摸操作

    我想知道是否可以使用 Android 辅助功能服务在屏幕上的位置执行触摸操作 例如 Bundle arguments new Bundle arguments putInt coord X X value arguments putInt
  • Android相当于javascript的setTimeout和clearTimeout?

    setTimeout 有一个答案https stackoverflow com a 18381353 433570 https stackoverflow com a 18381353 433570 它没有提供我们是否可以像在 JavaSc
  • 取消通知

    我使用Onesignal推送通知 需要取消所有onPause和onResume的通知 NotificationManager notificationManager NotificationManager getApplicationCon
  • twitter4j => AndroidRuntime(446): java.lang.NoClassDefFoundError: twitter4j.http.AccessToken

    我正在尝试使用 twitter4j 我的应用程序来连接并发布到 Twitter 我正在关注本教程 http blog doityourselfandroid com 2011 02 13 guide to integrating twitt
  • 从 Handler.obtainMessage() 获取什么参数

    我正在使用线程来执行一些 BT 任务 我正在尝试向 UI 线程发送消息 以便我可以基于我的 BT 线程执行 UI 工作 为此 我使用处理程序 但我不知道如何检索发送到处理程序的数据 要发送数据 我使用 handler obtainMessa
  • 使用 cordova cli 构建时的 Android 安装位置

    我正在使用 cordova CLI 工具构建一个大型 cordova phonegap 应用程序 我需要 AndroidManifest xml 文件中的 installLocation 具有 installLocation auto 或p
  • InAppMessage 一旦显示就会自动消失

    您好 我最近将 InAppMessaging 添加到我的项目中 这似乎很容易集成 但对我来说并没有按预期工作 首先 我将其添加到 build gradle 中 implementation com google firebase fireb
  • 使用 AndroidX ExifInterface 从图像中检索 GPS EXIF 数据?

    我的目标是 Android 13 并使用新的照片选择器 https developer android com training data storage shared photopicker检索图像 例如 val photoPicker
  • 在 Android ADT Eclipse 插件中滚动布局编辑器

    有谁知道当布局编辑器的内容溢出一个 屏幕 时如何滚动这些内容 我说的是在设计时使用 ADT 布局编辑器 而不是在物理设备上运行时滚动 效果很好 关闭 Android 布局编辑器中的剪辑 切换剪辑 按钮位于 Android 布局编辑器的右上角
  • 在 java 中运行外部应用程序但不要等待它完成

    我正在用java编写一个应用程序 允许我运行其他应用程序 为此 我使用了 Process 类对象 但当我这样做时 应用程序会等待进程结束 然后再退出 有没有办法在 Java 中运行外部应用程序 但不等待它完成 public static v
  • 使用单独的线程在java中读取和写入文件

    我创建了两个线程并修改了 run 函数 以便一个线程读取一行 另一个线程将同一行写入新文件 这种情况会发生直到整个文件被复制为止 我遇到的问题是 即使我使用变量来控制线程一一执行 但线程的执行仍然不均匀 即一个线程执行多次 然后控制权转移
  • BadPaddingException:无效的密文

    我需要一些帮助 因为这是我第一次编写加密代码 加密代码似乎工作正常 但解密会引发错误 我得到的错误是 de flexiprovider api exceptions BadPaddingException 无效的密文 in the 解密函数
  • firebase中按范围查询

    我有一个食品价格范围滑块 根据滑块的最小值和最大值 我想显示此范围内的食品 滑块代码 multiSlider setOnThumbValueChangeListener new MultiSlider SimpleChangeListene
  • 在DialogFragment中,onCreate应该做什么?

    我目前正在摆弄 DialogFragment 以学习使用它 我假设相比onCreateView onCreate 可以这样做 public void onCreate Bundle savedInstanceState super onCr

随机推荐

  • 与表无关的外键?

    首先 我确实读过这个 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 秒后 我需