【发布时间】:2018-03-21 09:25:28
【问题描述】:
我想制作一个应用程序列表应用程序,它通过包管理器通过嵌套在单例类中的AsyncTask<Void, Void, List<PackageSummary>> 获取应用程序列表。但是,当且仅当我实现异步任务时,RecyclerView 不会在第一个 OnCreate 上填充。
我确信我犯了一个愚蠢的错误和/或对 AsyncTask 和 RecyclerView 的理解不够好,但是为了我的爱,我找不到问题的根源。
In my toy app repository我准备了两个比较干净的分支,用于说明:
- 在主线程中获取包,并在第一个 Oncreate (git_UI_thread) 上填充 recyclerview。
- 其中调用了
AsyncTask<Void, Void, List<PackageSummary>>类。应用程序持久性尚未设置(故意),RecyclerView只会在应用程序旋转后填充(git_background_thread)。
对于不喜欢点击上面bitbucket链接的朋友,我的AsyncTask里面的代码sn-p是这样的:
@Override
protected void onPostExecute(List<SingletonPackageSummarySupplier.PackageSummary> packageSummaries) {
super.onPostExecute(packageSummaries);
isQueryingInProgress = false;
packageSummaryList = packageSummaries;
}
@Override
protected List<SingletonPackageSummarySupplier.PackageSummary> doInBackground(Void... voids) {
List<PackageSummary> installedPackages = new ArrayList<>();
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentActivities(intent, 0);
for (ResolveInfo resolveInfo : resolveInfoList) {
ActivityInfo activityInfo = resolveInfo.activityInfo;
installedPackages.add(new PackageSummary(resolveInfo.activityInfo));
}
return installedPackages;
}
这是我的主要活动 OnCreate:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
psList = SingletonPackageSummarySupplier.getInstance(context).getPackageSummaryListReadOnly();
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerViewLayoutManager = new LinearLayoutManager(context);
recyclerView.setLayoutManager(recyclerViewLayoutManager);
adapter = new AdapterApplist(context, psList);
recyclerView.setAdapter(adapter);
}
这就是单例的获取方式:
static SingletonPackageSummarySupplier instance;
public static SingletonPackageSummarySupplier getInstance(Context context) {
if (instance == null) {
instance = new SingletonPackageSummarySupplier(context);
} else{
instance.updateInstance(context);
}
return instance;
}
P.S.:我认为(但不确定)单例模式是合理的,以减少内存泄漏的变化。
P.S.2:我已经阅读了几个关于此的问题,但没有一个可以接受/有效的解决方案。
【问题讨论】:
-
您在何时何地执行异步任务?
标签: java android android-asynctask android-recyclerview