理解android

时间:2016-03-17 12:45:09

标签: android multithreading android-asynctask threadpool

在我的应用程序中,我在许多地方使用Async任务,最近我遇到的问题是下面的Async任务的doInBackground没有被调用,这种情况发生在我第三次执行下面的Async任务时(其他异步任务)也正在运行。)

protected class StatusTask extends AsyncTask<Void, Void, Void> {
    private final BluetoothDevice device;

    public StatusTask(BluetoothDevice device) {
        this.device = device;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        while (true) {
            if (someCondition) {
                Log.D(TAG,"hi hello")
                break;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                //e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        tTask=null;
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        System.out.println("onCancelled " + this.isCancelled());
    }

    @Override
    protected void onCancelled(Void aVoid) {
        super.onCancelled(aVoid);
        System.out.println("onCancelled result " + this.isCancelled());
    }
}

我正在执行上述任务,

 StatusTask  tTask = new StatusTask(device);   
 tTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

我在Android 4.4.3版上运行。

  1. 如何查看我的应用中当前正在运行的同步任务数量? Bcz我猜CORE_POOL_SIZE计数可能导致问题。

  2. 或者如果发生死锁或任何其他情况并阻止新的Async任务执行,android studio中是否有一种方法可以识别并杀死其他可能没用的异步任务?

    < / LI>
  3. 如果我使用CustomThreadPoolExecutor作为disconnectTask.executeOnExecutor(mCustomThreadPoolExecutor);使用更多的CorePoolSize工作正常,但是下一个使用AsyncTask.THREAD_POOL_EXECUTOR的Async任务的doInBackground()没有被调用。

2 个答案:

答案 0 :(得分:2)

当你多次运行<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> <link rel="stylesheet" href="normalize.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <style media="screen"> body { font-family: sans-serif; padding: 5px } .search-menu { height: 600px; background: #00003b; width: 500px; border: 1px solid black; padding: 5px } .search-menu-list { height: 100%; width: 100%; } .search-menu-list input { width: 100%; height: 30px; font-size: 16px; margin-bottom: 5px; padding: 0 4px 0 4px; } .search-menu-list ul { list-style: none; margin: 0; border: 0; padding: 0; overflow: hidden; overflow-y: scroll; background: white; width: 100%; height: 100%; border: 1px solid black; } .search-menu-list li { padding: 10px 5px 10px 5px; margin: -1px -1px 0 -1px; border-top: 1px solid black; -ms-user-select: none; cursor: default; } .search-menu-list li:hover { background: #f2f2f2; } </style> </head> <body> <div class="search-menu"> <div class="search-menu-list"> <input placeholder="Start typing to search..."> <ul> <li>This is a test list item</li> <li>This is a test list item</li> <li>This is a test list item</li> <li>This is a test list item</li> <li>This is a test list item</li> <li>This is a test list item</li> <li>This is a test list item</li> <li>This is a test list item</li> <li>This is a test list item</li> <li>This is a test list item</li> <li>This is a test list item</li> <li>This is a test list item</li> </ul> <div> </div> </body> </html> 时,它们都在同一个线程的队列中运行,因此,直到1个任务没有完成,下一个任务才会启动。

因为你从未完成任务......下一个任务将无法启动

查看AsyncTask video

答案 1 :(得分:1)

您好感谢Stallion和royB重播......我发现导致问题的原因......

多个AsynC任务的标准如下,

在甜甜圈之前(直到1.6版)

There was no concept of Multiple AsyncTask.

在Donut之后直到Honeycomb(1.6 - 3.0)

Here it uses multiple AsyncTask in parallel by default and you cannot customize it.

在Honeycomb之后直到Jelly Bean(版本3.0 - 4.3.1)

private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10);

来自KitKat(上图4.4):

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128);

当我在Android版本:4.4.3上运行时,我使用了Runtime.getRuntime()。availableProcessors();要在我的日志中打印CPU_COUNT,它显示2,所以2 + 1 = 3是我的设备的CORE_POOL_SIZE, 正如我从下面的工作室调试器控制台中看到的那样,

enter image description here

同时只有3个线程可以在我的设备中运行,并且这些线程已经被占用(正在运行)..因为我在doInbackground()方法中使用while循环,那些异步任务永远不会完成所以新的AsyncTask将进入队列并没有让线程执行。 现在我确保Async Task在其工作结束后正确终止。在我的修复之后你可以看到下面的异步任务(线程)可用(处于等待状态)以占用新的任务......

enter image description here