Android 8.0 Settings模块
AsyncTaskLoader获取应用缓存大小,安装包大小,存储占用大小
继承 AsyncLoader 类
获取AppStorageStats数据
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.applications;
import android.annotation.NonNull;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.UserHandle;
import android.util.Log;
import com.android.internal.util.Preconditions;
import com.android.settings.utils.AsyncLoader;
import com.android.settingslib.applications.StorageStatsSource;
import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
import java.io.IOException;
/**
* Fetches the storage stats using the StorageStatsManager for a given package and user tuple.
*/
public class FetchPackageStorageAsyncLoader extends AsyncLoader<AppStorageStats> {
private static final String TAG = "FetchPackageStorage";
private final StorageStatsSource mSource;
private final ApplicationInfo mInfo;
private final UserHandle mUser;
public FetchPackageStorageAsyncLoader(Context context, @NonNull StorageStatsSource source,
@NonNull ApplicationInfo info, @NonNull UserHandle user) {
super(context);
mSource = Preconditions.checkNotNull(source);
mInfo = info;
mUser = user;
}
// 执行结束后回调 onLoadFinished
@Override
public AppStorageStats loadInBackground() {
Log.d("suhuazhi", "FetchPackageStorageAsyncLoader loadInBackground");
AppStorageStats result = null;
try {
result = mSource.getStatsForPackage(mInfo.volumeUuid, mInfo.packageName, mUser);
} catch (NameNotFoundException | IOException e) {
Log.w(TAG, "Package may have been removed during query, failing gracefully", e);
}
return result;
}
@Override
protected void onDiscardResult(AppStorageStats result) {
}
}
使用 AsyncLoader
package com.android.settings.applications;
public class AppStorageSettings extends AppInfoWithHeader
implements OnClickListener, Callbacks, DialogInterface.OnClickListener,
LoaderManager.LoaderCallbacks<AppStorageStats> {
@Override
public Loader<AppStorageStats> onCreateLoader(int id, Bundle args) {
Context context = getContext();
return new FetchPackageStorageAsyncLoader(
context, new StorageStatsSource(context), mInfo, UserHandle.of(mUserId));
}
// loadInBackground 结束后回调
@Override
public void onLoadFinished(Loader<AppStorageStats> loader, AppStorageStats result) {
mSizeController.setResult(result);
updateUiWithSize(result);
}
@Override
public void onLoaderReset(Loader<AppStorageStats> loader) {
}
StorageStatsSource.AppStorageStats
应用缓存大小,安装包大小,存储占用大小
/**
* StorageStatsSource wraps the StorageStatsManager for testability purposes.
*/
public class StorageStatsSource {
/**
* Interface that exists to simplify testing. The platform {@link StorageStats} is too new and
* robolectric cannot see it. It simply wraps a StorageStats object and forwards method calls
* to the real object
*/
public interface AppStorageStats {
long getCodeBytes();
long getDataBytes();
long getCacheBytes();
long getTotalBytes();
}