【发布时间】:2018-10-19 12:04:13
【问题描述】:
我正在尝试使用AsyncTask 在后台执行一项任务,然后在完成时显示它,但结果是在完成之前什么都没有显示。
我也尝试使用 execute 和 doInBackground 来调用它,但两者都会导致相同的问题,我必须等待活动开始一切就绪,而不是显示带有加载进度条的页面,然后添加稍后列出。
代码:
private class listTask extends AsyncTask<Void,Void,Void> {
@Override
protected Void doInBackground(Void... voids) {
recyclerview.setAdapter(new ItemAdapter(getInternalFileList()));
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
progressbar.setVisibility(View.GONE);
}
List<GalleryItem> getInternalFileList(){
String path = getActivity().getFilesDir().toString();
File directory = new File(path);
File[] files = directory.listFiles();
List<GalleryItem> galleryItems = new ArrayList<>();
MainDBRepository repo = new MainDBRepository(getActivity());
HashMap<String,GalleryItem> itemsMap = repo.getItemsMap();
for(File file : files) {
if(itemsMap.containsKey(file.getName()))
galleryItems.add(itemsMap.get(file.getName()));
}
Collections.reverse(galleryItems);
return galleryItems;
}
private class ItemHolder extends RecyclerView.ViewHolder {
ImageView mItemImageView;
ItemHolder(View itemView) {
super(itemView);
mItemImageView = (ImageView) itemView.findViewById(R.id.image_view);
}
public void bindBackgroundImage(Bitmap backgroundImage){
mItemImageView.setImageBitmap(backgroundImage);
}
public void bindImageViewer(final String path){
mItemImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = ImageViewerActivity.newIntent(getActivity(), path);
startActivity(intent);
}
});
}
}
private class ItemAdapter extends RecyclerView.Adapter<ItemHolder> {
private List<GalleryItem> galleryItems;
ItemAdapter(List<GalleryItem> galleryItems) {
galleryItems = galleryItems;
}
@NonNull
@Override
public ItemHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
LayoutInflater inflater = LayoutInflater.from(getActivity());
View v = inflater.inflate(R.layout.gallery_item, viewGroup, false);
return new ItemHolder(v);
}
@Override
public void onBindViewHolder(@NonNull ItemHolder itemHolder, int position) {
GalleryItem galleryItem = galleryitems.get(position);
String path = getActivity().getFilesDir() + "/" + galleryItem.getID();
File file = new File(path);
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
itemHolder.bindBackgroundImage(bitmap);
itemHolder.bindImageViewer(path);
}
@Override
public int getItemCount() {
return galleryitems.size();
}
}
}
【问题讨论】:
-
Asynctask 在主线程本身上工作。它被创建为在主线程上运行。
-
如果你想在
AsyncTask正在计算的时候显示一些东西,你应该实现onProgressUpdate(Progress... values)方法,该方法从publishProgress(Progress... values)调用并实现后台任务进度下的逻辑。 -
请说明您如何调用异步任务。你没有使用
.get()是吗? -
第一次通话没问题。第二种是禁止的。永远不要那样做!
-
此外,您最好只在 doInBackground() 中获取文件列表,并在 onPostExecute() 中创建和设置适配器。
标签: java android android-asynctask