Android 如何在PagerAdapter的InstanceItem方法中使用AsyncTask
我想使用Android 如何在PagerAdapter的InstanceItem方法中使用AsyncTask,android,android-asynctask,android-viewpager,Android,Android Asynctask,Android Viewpager,我想使用ViewPager显示一些加密图像。为此,我创建了一个PagerAdapter的扩展,并将我的解密代码放在InstanceItem方法中。但问题是解密过程耗时太长。因此,我使用AsyncTask内部instanceItem方法来显示进度对话框 现在,ViewPager首先显示一个空白屏幕,我应该滑动以查看第一张图像。而且setCurrentItem()不起作用。 我的代码: public class FullScreenImageAdapter extends PagerAdapter
ViewPager
显示一些加密图像。为此,我创建了一个PagerAdapter
的扩展,并将我的解密代码放在InstanceItem
方法中。但问题是解密过程耗时太长。因此,我使用AsyncTask
内部instanceItem
方法来显示进度对话框
现在,ViewPager
首先显示一个空白屏幕,我应该滑动以查看第一张图像。而且setCurrentItem()
不起作用。
我的代码:
public class FullScreenImageAdapter extends PagerAdapter {
private Activity _activity;
private ArrayList<String> _imagePaths;
private LayoutInflater inflater;
ImageView imgDisplay;
// constructor
public FullScreenImageAdapter(Activity activity,
ArrayList<String> imagePaths) {
this._activity = activity;
this._imagePaths = imagePaths;
}
@Override
public int getCount() {
return this._imagePaths.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((RelativeLayout) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
inflater = (LayoutInflater) _activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container,
false);
imgDisplay = (ImageView) viewLayout.findViewById(R.id.img_axew);
new DisplayFile().execute(_imagePaths.get(position));
((ViewPager) container).addView(viewLayout);
return viewLayout;
}
private class DisplayFile extends AsyncTask<String, Integer, Integer> {
ProgressDialog progress;
String path;
Bitmap bitmap;
@Override
protected Integer doInBackground(String... arg0) {
path = arg0[0];
File file = new File(path);
try {
bitmap = AxerProcessor.getBitmapFromByte(AxerProcessor.decryptBytes(AxewActivity.password, AxerProcessor.decompressBytes(AxerProcessor.getFileBytes(file))));
} catch (Exception e) {
Toast.makeText(_activity, _activity.getString(R.string.error_wrong_password).replace("%s", file.getName()), Toast.LENGTH_LONG).show();
}
return null;
}
@Override
protected void onPreExecute() {
progress = ProgressDialog.show(_activity, _activity.getString(R.string.alert_decrypt_progress),
_activity.getString(R.string.alert_decrypt_progress_msg), false);
}
@Override
protected void onPostExecute(Integer result) {
progress.dismiss();
imgDisplay.setImageBitmap(bitmap);
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((RelativeLayout) object);
}
}
公共类FullScreenImageAdapter扩展了PagerAdapter{
私人活动;
私有ArrayList_ImagePath;
私人充气机;
图像视图imgDisplay;
//建造师
公共FullScreenImageAdapter(活动,
ArrayList图像路径){
这个。_活动=活动;
这是。_imagepath=imagepath;
}
@凌驾
public int getCount(){
返回此项。_imagepath.size();
}
@凌驾
公共布尔值isViewFromObject(视图,对象){
返回视图==((RelativeLayout)对象);
}
@凌驾
公共对象实例化项(视图组容器,int位置){
充气器=(充气器)\u活动
.getSystemService(上下文布局\充气机\服务);
查看视图布局=充气机。充气(R.layout.layout\u全屏图像,容器,
假);
imgDisplay=(ImageView)viewLayout.findViewById(R.id.img\u axew);
新建DisplayFile().execute(_imagepath.get(position));
((ViewPager)容器)。添加视图(viewLayout);
返回视图布局;
}
私有类DisplayFile扩展异步任务{
进程对话进程;
字符串路径;
位图;
@凌驾
受保护的整数doInBackground(字符串…arg0){
path=arg0[0];
文件=新文件(路径);
试一试{
位图=AxeProcessor.getBitmapFromByte(AxeProcessor.decryptBytes(AxeActivity.password,AxeProcessor.decompressBytes(AxeProcessor.getFileBytes(文件)));
}捕获(例外e){
Toast.makeText(_activity,_activity.getString(R.string.error\u error\u password)。替换(“%s”,file.getName()),Toast.LENGTH\u LONG)。show();
}
返回null;
}
@凌驾
受保护的void onPreExecute(){
progress=ProgressDialog.show(_activity,_activity.getString(R.string.alert\u decrypt\u progress),
_activity.getString(R.string.alert\u decrypt\u progress\u msg),false);
}
@凌驾
受保护的void onPostExecute(整数结果){
进步。解散();
设置图像位图(位图);
}
}
@凌驾
公共项(视图组容器、int位置、对象){
((ViewPager)容器)。移除视图((RelativeLayout)对象);
}
}
我想您错过了对PagerAdapter.notifyDataSetChanged()的调用
您可以调用notifyDataSetChanged():
- 调用.addView()[在这种情况下,首先会出现一个空白屏幕],或者
- 您可以将更多代码(充气视图、添加视图)移动到onPostExecute中,以便在图像完全准备好渲染之前不会发生任何事情
- 调用.addView()[在这种情况下,首先会出现一个空白屏幕],或者
- 您可以将更多代码(充气视图、添加视图)移动到onPostExecute中,以便在图像完全准备好渲染之前不会发生任何事情
AsyncTask
的get()
方法来返回真正的结果。解决方案是等待结果(viewLayout
)。因此,我的代码更改为:
public class FullScreenImageAdapter extends PagerAdapter {
private Activity _activity;
private ArrayList<String> _imagePaths;
private LayoutInflater inflater;
ImageView imgDisplay;
View viewLayout;
private ViewGroup container;
// constructor
public FullScreenImageAdapter(Activity activity,
ArrayList<String> imagePaths) {
this._activity = activity;
this._imagePaths = imagePaths;
}
@Override
public int getCount() {
return this._imagePaths.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((RelativeLayout) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
this.container = container;
DisplayFile df = new DisplayFile();
df.execute(_imagePaths.get(position));
View result = null;
try {
result = df.get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {
}
return result;
}
private class DisplayFile extends AsyncTask<String, View, View> {
ProgressDialog progress;
String path;
Bitmap bitmap;
@Override
protected View doInBackground(String... arg0) {
path = arg0[0];
File file = new File(path);
try {
bitmap = AxerProcessor.getBitmapFromByte(AxerProcessor.decryptBytes(AxewActivity.password, AxerProcessor.decompressBytes(AxerProcessor.getFileBytes(file))));
} catch (Exception e) {
Toast.makeText(_activity, _activity.getString(R.string.error_wrong_password).replace("%s", file.getName()), Toast.LENGTH_LONG).show();
}
return viewLayout;
}
@Override
protected void onPreExecute() {
progress = ProgressDialog.show(_activity, _activity.getString(R.string.alert_decrypt_progress),
_activity.getString(R.string.alert_decrypt_progress_msg), false);
inflater = (LayoutInflater) _activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container,
false);
}
@Override
protected void onPostExecute(View result) {
progress.dismiss();
imgDisplay = (ImageView) result.findViewById(R.id.img_axew);
imgDisplay.setImageBitmap(bitmap);
((ViewPager) container).addView(result);
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((RelativeLayout) object);
}
}
公共类FullScreenImageAdapter扩展了PagerAdapter{
私人活动;
私有ArrayList_ImagePath;
私人充气机;
图像视图imgDisplay;
视图布局;
私有视图组容器;
//建造师
公共FullScreenImageAdapter(活动,
ArrayList图像路径){
这个。_活动=活动;
这是。_imagepath=imagepath;
}
@凌驾
public int getCount(){
返回此项。_imagepath.size();
}
@凌驾
公共布尔值isViewFromObject(视图,对象){
返回视图==((RelativeLayout)对象);
}
@凌驾
公共对象实例化项(视图组容器,int位置){
this.container=容器;
DisplayFile df=新的DisplayFile();
执行(_imagepath.get(position));
查看结果=空;
试一试{
结果=df.get();
}捕捉(中断异常e){
}捕获(执行例外){
}
返回结果;
}
私有类DisplayFile扩展异步任务{
进程对话进程;
字符串路径;
位图;
@凌驾
受保护视图doInBackground(字符串…arg0){
path=arg0[0];
文件=新文件(路径);
试一试{
位图=AxeProcessor.getBitmapFromByte(AxeProcessor.decryptBytes(AxeActivity.password,AxeProcessor.decompressBytes(AxeProcessor.getFileBytes(文件)));
}捕获(例外e){
Toast.makeText(_activity,_activity.getString(R.string.error\u error\u password)。替换(“%s”,file.getName()),Toast.LENGTH\u LONG)。show();
}
返回视图布局;
}
@凌驾
受保护的void onPreExecute(){
progress=ProgressDialog.show(_activity,_activity.getString(