Android 中调用线程thread.stop 方法后报错,Deprecated Thread methods are not supported.

OpenRA引擎实战:如何从零开始搭建一个经典RTS游戏模组(附资源包) 本文详细介绍了如何利用开源游戏引擎OpenRA从零开始搭建经典RTS游戏模组。内容涵盖开发环境配置、资源管线处理、YAML规则定义、地图编辑与Lua脚本编写等全流程实战指南,并提供了资源包,帮助开发者和爱好者快速创建属于自己的即时战略游戏世界。 阅读详情
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global: Deprecated Thread methods are not supported.
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global: java.lang.UnsupportedOperationException
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at java.lang.VMThread.stop(VMThread.java:85)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at java.lang.Thread.stop(Thread.java:1280)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at java.lang.Thread.stop(Thread.java:1247)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at tech.androidstudio.handlerdemotimer.MainActivity.btnDaoJiShi(MainActivity.java:69)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at java.lang.reflect.Method.invokeNative(Native Method)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at java.lang.reflect.Method.invoke(Method.java:507)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at android.view.View$1.onClick(View.java:2139)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at android.view.View.performClick(View.java:2485)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at android.view.View$PerformClick.run(View.java:9080)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at android.os.Handler.handleCallback(Handler.java:587)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at android.os.Handler.dispatchMessage(Handler.java:92)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at android.os.Looper.loop(Looper.java:123)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at android.app.ActivityThread.main(ActivityThread.java:3683)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at java.lang.reflect.Method.invokeNative(Native Method)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at java.lang.reflect.Method.invoke(Method.java:507)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

03-16 15:39:03.082 16179-16179/tech.androidstudio.handlerdemotimer E/global:     at dalvik.system.NativeStart.main(Native Method)

原因:

现在Thread.stop()方法已经过时了。不支持使用,


解决方法:

现在都是在run方法中使用标记。然后通过设置标记来更改线程的状态。

参考:http://zhidao.baidu.com/link?url=7Fd-DO_FE0G3H83j_jYCF-ZS2GKwhrW-yT5NscHnEavzTm6xaaHs6d2xXWhZd4A673yj1YzMuZJ7pcnKvQ-EIK


例如,这里的倒计时的代码:

package tech.androidstudio.handlerdemotimer;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements Runnable {
private Handler mainHandler;
    private TextView mTextView;
    private Thread mThread;
    private boolean mflag;
    private int mCount=10;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //主线程的 handler 接收到 子线程的消息,然后修改TextView的显示
        mainHandler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                int what = msg.what;
                switch (what){
                    case 1:
                        int arg1 = msg.arg1;
                        Log.d("Kodulf","Handler arg1="+arg1);
                        Log.d("Kodulf", "TestView  =" + mTextView.getText().toString());
                        mTextView.setText(String.valueOf(arg1));
                        break;
                }
            }
        };

        mTextView=(TextView)findViewById(R.id.textView);

        //子线程的初始化
        mThread = new Thread(this);
    }

    //TODO 这里才是最关键的部分:首先判断子线程是否是活动的状态,
    //TODO 如果不是活动的话,就是开始计时器或者重启计时器
    //TODO 如果是活动的话,就是暂停计时器。
    public void btnDaoJiShi(View view) {
        Log.d("Kodulf","mThread state"+mThread.getState());
        Log.d("Kodulf","mThread toString"+mThread.toString());

        if(!mThread.isAlive()){
            //开始计时器或者是重启计时器,设置标记为true
            mflag=true;
            //判断是否是第一次启动,如果是不是第一次启动,那么状态就是Thread.State.TERMINATED
            //不是的话,就需要重新的初始化,因为之前的已经结束了。
            //并且要判断这个mCount 是否为-1,如果是的话,说名上一次的计时已经完成了,那么要重新设置。
            if(mThread.getState()==Thread.State.TERMINATED){
                mThread = new Thread(this);
                if(mCount==-1) mCount=10;
                mThread.start();
            }else{
                mThread.start();
            }
        }else {
            //暂停计时器,设置标记为false
            mflag=false;
            //不可以使用 stop 方法,会报错,java.lang.UnsupportedOperationException
            //mThread.stop();
        }
    }

    @Override
    public void run() {
        //子线程必须要设置这个标记mflag和倒计时数。
        while(mflag&&mCount>=0){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //每间隔 一秒钟 发送 一个Message 给主线程的 handler让主线程的hanlder 来修改UI
            //注意 这里的 message可以是通过obtain来获取 这样节省内存,它会自动的看有没有可以复用的,就不重复创建了
            Message message = Message.obtain();
            message.what=1;
            message.arg1=mCount;
            mainHandler.sendMessage(message);
            Log.d("Kodulf","mCount="+mCount--);
        }
    }

    //一定记住了要在onDestroy方法里面停止线程,这里数字小看不出来,如果在其他的地方可能就会影响性能了
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mflag=false;
    }
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:orientation="vertical"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始和暂停倒计时"
        android:onClick="btnDaoJiShi"/>
    <TextView android:text="10秒\n倒计时" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="90sp"
        android:id="@+id/textView"/>
</LinearLayout>



edusrc挖掘思路 edusrc挖掘思路前言思路信息搜集系统账号常见漏洞实战分享1、确定目标,语法:site:xxxx.edu.cn2、账号密码组成我们知道了,谷歌语法查找工号3、爆破登录系统4、确定功能,抓具体的url5、添加单引号,报错,是mssql6、报数据库版本,到这一步就可以交了,已经是中危了后记 前言 一月份的时候偶然注意到edusrc,起初是抱着学习的心态去挖几个洞,可是后面发现有证书,而且还贼好看,于是我动了凡心,一顿操作也拿了几本,广西民大、山东理工、同济,未到的有浙大、上海理工,证书要求证书图片可以在我个人 阅读详情

相关推荐

WSL 相关命令时遇到了 “无法从raw.githubusercontent.com提取分发列表、操作超时

核心问题:国内网络屏蔽raw.githubusercontent.com,导致WSL无法获取发行版列表;最优方案:优先用方案1(手动指定发行版安装),无需改配置,1分钟搞定;永久修复:用方案2(修改hosts),适合需要管理多个WSL发行版的场景;兜底方案:用方案3(手动下载安装包),适配所有网络环境。按以上步骤操作后,你不仅能正常安装WSL,等命令也能正常执行,后续可正常使用WSL搭配Docker Desktop(如切换WSL 2后端),无需再担心网络超时问题。

weixin_39766667的博客 2125

Thread线程停止的正确方式

前言:革命的本钱是身体,要健康;幸福的根本是平安,要保重;成功的基石是努力,要勤奋;快乐的源泉是开心,要微笑;生活的真谛是洒脱,要享受。 一、概述 当我们使用Thread.stop()方法去停止线程时,这个方法会报错,抛出了UnsupportedOperationException异常,它在JDK中已经被声明“过期/作废”的方法,显然它在功能上有缺陷,不建议使用。 stop()方法的源码...

https://juejin.cn/user/1654096907477549/posts 2万+

笔记汇总 | 斯坦福 CS229 机器学习

本文为斯坦福大学 2014 秋季 CS229 机器学习课程学习笔记本文主体部分转载自黄海广博士,文末已给出,大家有兴趣可以直接访问笔记首页,下载对应课程资料及作业代码。

ReturnTmp的博客 2462

Thread.stop() 与 ThreadDeath 的理解、注意点以及误区

Thread.stop() 与 ThreadDeath 的理解、注意点以及误区

赵丙双的博客 1267

【线粒体基因组数据提交实战】从注释校验到GenBank批量入库的避坑指南

本文详细介绍了线粒体基因组数据从注释校验到GenBank批量上传的全流程避坑指南。重点解析了GB2sequin工具的正确使用方法、TBL注释文件的精修技巧,以及BankIt平台提交的隐藏要点,帮助科研人员高效完成NCBI数据提交,特别适合需要批量上传线粒体基因组数据的研究者。

weixin_28726671的博客 442

OTFS从零开始11 10

未来的无线网络有望提供全球覆盖,因此需要支持在恶劣环境下的各种新兴应用,例如飞机上的移动通信(MCA)、低地球轨道(LEO)卫星通信、车对车(V2V)通信、高速铁路(HSR)通信、无人驾驶飞机(UAV)通信和水下声学通信(UAC)。在这些恶劣环境中的无线信道通常被视为对通信不友好,其特点是严重的延迟和多普勒扩散,以及有限的路径寿命等。这些不利于通信的特性使目前移动网络中广泛采用的正交频分复用(OFDM)调制的性能恶化。

qq_46009045的博客 9851

终止线程的三种方法

有三种方法可以使终止线程。    1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。    2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。    3.  使用interr

涑飏的专栏 9万+

SMPTE ST 2110 概论(一)

SMPTE ST 2110 概论(一)前言ST 2110与ST 2022-6ST 2110-10:基本结构与时序ST 2110-20:未压缩的视频流后续 前言 这是一份我在实习期间制作的,关于SMPTE ST 2110的简单介绍。 这篇文章主要以梳理总结 SMPTE ST 2110 的概念为主,关于具体的内容,比如IP数据报的格式、RTP时间戳的具体代码内容等等,大家可以查阅 SMPTE ST 2...

Cidd0422的博客 2万+

android 为什么不建议使用Thread.stop()

当调用Thread.stop()方法时,会发生以下两种事情: 1. 即可抛出ThreadDeath异常,在线程的run()方法里面,任何一刻都可能抛出ThreadDeath Error,包括在catch或者finally语句中。 2. 释放该线程的所有锁。 当线程抛出ThreadDeath异常时,会导致线程的run()方法突然返回来达到停止该线程的目的。这个异常可以在

jiahui_zhu的博客 3631

Java与OSG的梦幻联动:深入编译OpenSceneGraph的Java JNI桥梁,开启3D视觉盛宴的奇幻之旅

🔥关注墨瑾轩,带你探索编程的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手🚀🔥技术宝库已备好,就等你来挖掘🚀🔥订阅墨瑾轩,智趣学习不孤单🚀🔥即刻启航,编程之旅更有趣🚀在编译OpenSceneGraph (OSG) 的Java版本时,首先需要了解OSG本身是一个主要用于3D图形和视觉仿真的开源库,它主要支持C++。然而,OSG 也支持通过JNI(Java Native Interface)与Java集成,这允许Java程序调用OSG的C++库。

java专栏 869

搞懂 SAPUI5 Fiori 应用的 OData 授权维护:从 IWSG、IWSV 到 S_SERVICE 的完整实践

本文探讨了SAP Fiori项目中常见的授权问题及其解决方案。文章指出,开发人员常误将OData服务访问问题归咎于前端代码或配置,而实际上多因授权默认值未正确带入角色所致。详细分析了IWSG(前端服务组元数据)和IWSV(后端业务服务)两个关键对象的作用机制,强调应通过PFCG角色的Authorization Default入口维护服务对象,而非直接修改S_SERVICE授权对象。文章还提供了前后端授权配置的具体操作步骤,并特别提醒需同时配置前端和后端授权,才能确保应用完整可用性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 206

android 终止线程几种方法

有时当一个组件或者activity被destory()的时候要求其启动的线程也一起终止掉,现在就来总结了一下有这有几种方法:   1、初始化的时候,定义启动的线程为一个守护线程,这样当主线程消亡掉的时候,其他线程也会被终止。   // 使用下面的方法,当初始化一个线程时   myThread.setDaemon(true);   myThread.start   2、

仰视未来的专栏 8227

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

android中止线程_android 停止 终止 Thread 线程的三种方法

有三种方法可以使终止线程。1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。3. 使用interrupt方法中断线程。1. 使用退出标志终止线程当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行...

weixin_39884832的博客 3450

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

2022-01-26 Android java 使用线程(Thread)自带的isInterrupted()方法来结束线程,不能用stop。

一、Thread.stop()方法来结束线程的运行是很危险,一般不建议使用stop()来停止线程;不安全的原因主要有:在程序调用Thread.stop()后会抛出ThreadDeatherror()错误。并释放子线程所持有的所有锁,会导致被保护数据呈现不一致性,此过程不可控。实际运行这么用app直接挂了。 二、java 使用线程(Thread)自带的isInterrupted()方法来结束线程。isInterrupted()判断是否被中断,并清除当前中断状态。 1、代码如下 ...

海月汐辰 1097

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android 线程安全退出,android 中,关于线程安全退出的问题(from stack overflow)

There are several problems in the code sample you posted I will address in order:1) Thread.stop() has been deprecated for quite some time now, as it can leave dependent variables in inconsistent state...

weixin_31082403的博客 253

Android知识点之线程停止

文章目录线程停止的三种方式interrupt案例正常状态阻塞状态标记位停止stop方法停止循环(不推荐) 线程停止的三种方式 标记位 stop方法 interrupt方法 三种方法的优缺点: 标记位:通俗易懂,简单,只能处理正常线程,对阻塞线程束手无策,例如:sleep方法、IO读写等。 stop方法:不安全,在Android中该方法不能使用(会抛异常) interrupt方法:推荐使用 正常...

lijianbiao0的博客 1711

Android 中如何关闭线程 .

在android中开启的线程用Thread.stop()来关闭是不会真正关闭的,当我们再次start线程的时候,会产生异常:Thread is already started. 针对这个问题可以在线程的run方法里,加一个判断标志。例如:               class TestThread extends Thread{                          publi

cw2004100021124的专栏 2355

Android 中如何关闭线程

在android中开启的线程用Thread.stop()来关闭是不会真正关闭的,当我们再次start线程的时候,会产生异常:Thread is already started. 针对这个问题可以在线程的run方法里,加一个判断标志。例如:               class TestThread extends Thread{                          publi

liuhanhan512的专栏 1万+

android 结束thread

Android 中如何结束线程 在 Android 开发中,线程的管理是一个重要的课题。使用线程可以帮助我们执行耗时的操作,比如网络请求、文件读写等,但不当的线程处理也会导致内存泄漏或应用崩溃。本文将介绍如何安全地结束线程,并提供相应的代码示例。 什么是线程 线程是进程中可独立调度和执行的最小单位。在 Android 中,...

weixin_35466750的博客 210

为什么 Thread.stop和Thread.suspend等被废弃了?

为什么 Thread.stop被废弃了? 因为其天生是不安全的。停止一个线程会导致其解锁其上被锁定的所有监视器(监视器以在栈顶产生ThreadDeath异常的方式被解锁)。如果之前被这些监视器保护的任何对象处于不一致状态,其它线程看到的这些对象就会处于不一致状态。这种对象被称为受损的 (damaged)。当线程在受损的对象上进行操作时,会导致任意行为。这种行为可能微妙且难以检测,也可能会比较

kesideyu1989的专栏 689

android多线程之二:终止线程的三种方法

有三种方法可以终止线程:一.使用退出标志位使用退出标志位,使线程正常退出,也就是当run方法完成后线程终止。 有时候为了完成一些需要重复执行的任务,如服务器监听客户端的请求,会在线程的run方法中使用while(true){……}来处理,但要想使while循环在某一特定条件下退出,最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退

lixpjita39的专栏 1062

如何关闭线程 android,Android如何安全的关闭线程

正常状况下,当线程中的run方法执行完毕后,线程是会自动关闭,不须要咱们手动去关闭的。ide如:spanewThread(newRunnable(){@Overridepublicvoidrun(){//执行操做}}).start();该线程在run方法中的操做执行完毕后,线程会自动关闭。线程而当run方法中的操做会不断循环执行时如:codenewThread(newRunnabl...

weixin_33037813的博客 3426

我爱学Java之Thread中stop(),suspend(),resume()为什么不安全

当调用stop()方法时会发生两件事:1.即刻停止run()方法中剩余的全部工作,包括在catch或finally语句中,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。2.会立即释放该线程所持有的所有的锁,导致数据得不到同步的处理,出现数据不一致的问题。举个例子:public class Main{

JavaSheng的专栏 3433

Android如何安全的关闭线程

正常情况下,当线程中的run方法执行完毕后,线程是会自动关闭,不需要我们手动去关闭的。  如: new Thread(new Runnable() {     @Override     public void run() {         //执行操作     } }).start(); 该线程在run方法中的操作执行完毕后,线程会自动关闭。   而当run方法中的操作会不断循环...

认真做事,开心生活 1万+

解析为什么Thread中的stop(), suspend(), resume() 会被Deprecated

Why is Thread.stop deprecated? Because it is inherently unsafe. Stopping a thread causes it to unlock all the monitors that it has locked. (The monitors are unlocked as the ThreadDeath exception pr

zbryan的专栏 5151

UnsupportedOperationException异常解决

壹哥在教课的过程中,经常会让大家思考如何才能让自己一点点成为一个经验丰富的开发大神。我觉得成为大神的一个方法就是,要养成良好的学习习惯,比如记录学习开发过程中遇到的每一个难题。一. bug 重现这不,最近壹哥的一个学生在写代码时,使用Arrays.asList()工具类想把数组转换成集合,然后他想在数组转换的集合中再添加新的元素,结果莫名其妙地抛出了 UnsupportedOperationException 异常,这是怎么产生的呢?于是我就把这个异常产生的原因和解决过程记录了下来,供大家参考来养成自己的学

一一哥 2366
上一篇: textView.setText() 的时候报错 android.content.res.Resources$NotFoundException: String resource ID #0x0
下一篇: 子线程Handler.sendMessage 报错:Attempt to invoke virtual method 'boolean android.os.Handler.sendMessage
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值