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

私の理解では、何かを 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);

私のメインスレッド内から。

4

2 に答える 2

1

新しい pruneDiskCacheTask(); が必要です。「new pruneDiskCacheTask().execute()」ではありませんか?

于 2015-03-06T05:20:14.707 に答える
0

Shirish Hirekodi のおかげで答えが見つかりました。それはメソッドそのものではありませんでした

 if(DiskCache.exists()){

 }

私が呼び出したときの比較は、非同期タスク内に配置する必要があるタスクを作成していました。

ありがとう。

于 2015-03-09T20:15:43.193 に答える