Android Dev - 严格模式问题

时间:2015-03-06 04:13:10

标签: android android-strictmode disk-access

我遇到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();
        }
    }
}

这是从我的Cache类中调用的,它是如此创建的

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

来自我的主线程。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

感谢Shirish Hirekodi,我找到了答案。

这不是方法本身
 if(DiskCache.exists()){

 }
当我调用时,比较是创建需要放入异步任务的任务。

感谢。