【问题标题】:In android,how to stop the child thread containing a handler when the activity exit?在android中,当活动退出时如何停止包含处理程序的子线程?
【发布时间】:2016-05-18 09:30:25
【问题描述】:

示例:

new Thread(){
        private Message message;

        public void run() {
            PackageManager packageManager = getPackageManager();
            List<PackageInfo> packages = packageManager.getInstalledPackages(0);


            progressBar1.setMax(packages.size());
            int progress = 0;



            for (PackageInfo packageInfo : packages) {
                ScanInfo scanInfo = new ScanInfo();
                String appName = packageInfo.applicationInfo.loadLabel(packageManager).toString();
                String packageName = packageInfo.packageName;
                scanInfo.appName = appName;
                scanInfo.packageName = packageName;
                String sourceDir = packageInfo.applicationInfo.sourceDir;
                String md5 = MD5Utils.getFileMd5(sourceDir);
                String desc = AntivirusDao.checkFileVirus(md5);

                System.out.println("-------------------------");

                System.out.println(appName);

                System.out.println(md5);


                if(desc == null){
                    scanInfo.desc = false;
                }else{
                    scanInfo.desc = true;
                }
                progress++;
                progressBar1.setProgress(progress);
                message = Message.obtain();
                message.what = SCANNING;
                message.obj = scanInfo;
                handler.sendMessage(message);
            }
            message = Message.obtain();
            message.what = FINISHED;
            handler.sendMessage(message);
        };
    }.start();

  1. 我在一个包含一个 处理程序更改 ui,但是当我退出活动时,如何停止子线程?
  2. 当我按下返回键时,我希望子线程继续运行。但是当我重新进入活动并更改用户界面时,我应该如何跟踪进度?

线程?

【问题讨论】:

标签: android multithreading


【解决方案1】:

我以前也是这样的:

  1. 定义一个类扩展Thread
  2. 使用HashSet 或其他东西在每个线程运行后保留它
  3. 中断 HashSet 中的所有线程

代码如下,希望有帮助

HashSet<MyThread> myThreads = new HashSet<>();

@Override
public void onDestroy() {
    super.onDestroy();
    if (myThreads.iterator().hasNext())
        myThreads.iterator().next().interrupt();
}

private void doSomething() {
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            //doing some work
        }
    };
    MyThread thread = new MyThread(runnable);
    thread.run();
    myThreads.add(thread);
}

class MyThread extends Thread {
    public MyThread(Runnable runnable) {
        super(runnable);
    }
}

【讨论】:

  • 那么如何解决第二个问题呢?我的第一个想法是覆盖后退键。对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2013-04-03
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多