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

这篇博客探讨了在Android中使用Thread.stop方法时遇到的错误,由于该方法已废弃,导致应用报错。作者指出,现代做法是通过在run方法内设置标记来控制线程状态。并提供了一个倒计时代码示例作为解决方案的参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值