【问题标题】:Android Dev - Strict Mode ProblemsAndroid 开发 - 严格模式问题
【发布时间】:2015-03-06 04:13:09
【问题描述】:

我在使用 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

我的理解是,如果您将某些内容放入 Async Task 中,则它符合 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);

在我的主线程中。

【问题讨论】:

  • 您能否包括调用 AsyncTask 的位置?
  • 对严格模式进行了更多研究。似乎是一个调试工具,可确保您的程序尽可能快地运行。所以问题是:有没有更好的(更少的资源消耗)方法来做到这一点?因为这只发生在用户强制重新加载数据集时,我会将其标记为必要的邪恶。
  • StrictMode 仅在您在主线程上执行操作时触发(当然,您不应该这样做) - 再次,我们需要查看您在哪里调用 AsyncTask 以了解它的原因正在发生。
  • 添加了它被调用的地方。感谢您的快速回复:)

标签: android android-strictmode disk-access


【解决方案1】:

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

【讨论】:

  • 不。仍在发生。是的,应该是。但添加它并没有停止违规
  • 太糟糕了......如果我是你,1。我会将 logcat 发布到 SO。 2. 注释掉 doInBackground() 内部的方法,并逐步添加位以找出有问题的代码行。问题可能在此 AsyncTask 之外
【解决方案2】:

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

 if(DiskCache.exists()){

 }

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

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2014-07-09
    相关资源
    最近更新 更多