0

我在使用 StrictMode 时遇到问题,我有以下 AsyncTask

class pruneDiskCacheTask extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... params) {

        pruneRecursive(DiskCache);

        return null;
    }

    void pruneRecursive(File fileOrDirectory){
        if (fileOrDirectory.isDirectory()) {
            for (File child : fileOrDirectory.listFiles()) {
                pruneRecursive(child);
            }
        }else {
            if(checkForPruningAsync(fileOrDirectory)){
                fileOrDirectory.delete();
            }
        }
    }

    public boolean checkForPruningAsync(File file){
        String fileName = file.getName();
        String type = fileName.substring(fileName.lastIndexOf(".")+1);

        Date lastModified = new Date(file.lastModified());

        if(type.equals("json")){
            Date cacheLifetime = new Date(new Date().getTime() - keepJsonFor);
            if(lastModified.before(cacheLifetime)){
                return true;
            }
        }else if(type.equals("txt")) {
            Date cacheLifetime = new Date(new Date().getTime() - keepTxtFor);
            if(lastModified.before(cacheLifetime)){
                return true;
            }
        }else{
            Date cacheLifetime = new Date(new Date().getTime() - keepImagesFor);
            if(lastModified.before(cacheLifetime)){
                return true;
            }
        }

        return false;
    }
} 

它抛出一个 StrictMode 错误(似乎没有使程序崩溃,但我不喜欢它弹出)

 android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk

我的理解是,如果您将某些内容放入异步任务中,则它符合 StrictMode 的要求。但在这种情况下,我似乎错了。有人可以告诉我我做错了什么吗?

编辑

这是我按要求调用异步任务的方式

public void pruneDiskCache(){
    synchronized (mDiskCacheLock) {
        // Wait while disk cache is started from background thread
        while (mDiskCacheStarting) {
            try {
                mDiskCacheLock.wait();
            } catch (InterruptedException e) {
            }
        }
        if(DiskCache.exists()) {
            new pruneDiskCacheTask().execute();
        }
    }
}

这是从我的缓存类中调用的,它是这样创建的

mActivity = this;
cacheHandeler = new Cache(mActivity);

从我的主线程中。

4

2 回答 2

1

应该 new pruneDiskCacheTask(); 不是“新的 pruneDiskCacheTask().execute()”?

于 2015-03-06T05:20:14.707 回答
0

感谢 Shirish Hirekodi,我找到了答案。这不是方法本身,而是

 if(DiskCache.exists()){

 }

我打电话时的比较是创建需要放在异步任务中的任务。

谢谢。

于 2015-03-09T20:15:43.193 回答