Android 异步任务中的进度对话框(PostExecute)
我实现了一个异步任务,为视频播放列表创建缩略图。在后台线程期间,我实现了一个进度对话框,该对话框在预执行任务中触发。目前,我正在关闭postExecute方法的对话框,但我肯定遗漏了什么。我能在这方面得到一些帮助吗 我的代码在下面 VideoListActivity.javaAndroid 异步任务中的进度对话框(PostExecute),android,android-listview,android-asynctask,android-bitmap,Android,Android Listview,Android Asynctask,Android Bitmap,我实现了一个异步任务,为视频播放列表创建缩略图。在后台线程期间,我实现了一个进度对话框,该对话框在预执行任务中触发。目前,我正在关闭postExecute方法的对话框,但我肯定遗漏了什么。我能在这方面得到一些帮助吗 我的代码在下面 VideoListActivity.java package com.oneplc.viessmannapp; 导入java.io.File; 导入java.text.simpleDataFormat; 导入java.util.Date; 导入java.util.Lo
package com.oneplc.viessmannapp;
导入java.io.File;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入java.util.Locale;
导入android.media.MediaPlayer;
导入android.net.Uri;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.os.Environment;
导入android.os.Handler;
导入android.os.Message;
导入wseemann.media.ffmpegmediametadata检索器;
导入android.media.ThumbnailUtils;
导入android.provider.MediaStore;
导入android.widget.GridView;
导入android.annotation.SuppressLint;
导入android.app.Activity;
导入android.app.ProgressDialog;
导入android.content.Context;
导入android.content.Intent;
导入android.graphics.Bitmap;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.Adapter;
导入android.widget.AdapterView;
导入android.widget.BaseAdapter;
导入android.widget.ImageView;
导入android.widget.ListView;
导入android.widget.TextView;
导入android.widget.Toast;
导入android.widget.AdapterView.OnItemClickListener;
公共类VideoListActivity扩展了活动{
专用静态进程对话框;
私有静态字符串媒体路径;
String[]fileList=null;
ListView-mList;
字符串文件路径;
字符串MIME_TYPE=“video/mp4”;
私有图像视图goBack;
私有静态上下文mContext;
专用图像适配器mAdapter;
私有处理程序mHandler=新处理程序(){
@凌驾
公共无效handleMessage(消息消息消息){
mAdapter.notifyDataSetChanged();
}
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u video\u列表);
goBack=(ImageView)findViewById(R.id.back\u btn);
mContext=这个;
setActionListeners();
String folder=getIntent().getStringExtra(“文件夹”);
媒体路径=新字符串(Environment.getExternalStorageDirectory().getPath()+“/”+文件夹+“/”;
updateVideoList();
FILE_PATH=Environment.getExternalStorageDirectory().getPath()+“/”+folder+“/”;
mList=(ListView)findViewById(R.id.listView1);
如果(文件列表!=null){
mAdapter=新的ImageAdapter(此,文件列表);
mList.setAdapter(mAdapter);
}
mList.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父视图、视图v、,
内部位置,长id){
Toast.makeText(
getApplicationContext(),
((文本视图)v.findViewById(R.id.item_title))
.getText(),Toast.LENGTH_SHORT).show();
字符串videoFilePath=文件路径+文件列表[位置];
System.out.println(“*******************************************视频文件路径*******************”+视频文件路径);
System.out.println(“*****************************************************************************”+MiME_类型);
//意图=新意图(android.content.Intent.ACTION\u视图);
//File newFile=新文件(videoFilePath);
//intent.setDataAndType(Uri.fromFile(newFile),MiME_类型);
//星触觉(意向);
意向意向=新意向(VideoListActivity.this、VideoViewActivity.class);
intent.putExtra(“视频路径”,videoFilePath);
星触觉(意向);
}
});
}
私有void setActionListeners(){
//TODO自动生成的方法存根
goBack.setOnClickListener(新视图.OnClickListener(){
@SuppressLint(“新API”)
@凌驾
公共void onClick(视图){
//TODO自动生成的方法存根
//清除VM堆堆栈
gc();
完成();
}
});
}
公共静态字符串FormatDate(日期yourDate){
SimpleDataFormat sdf=新的SimpleDataFormat(“mm:ss”,Locale.US);
返回sdf.format(您的日期);
}
public void updateVideoList(){
文件videoFiles=新文件(媒体路径);
Log.d(“*********videoFiles的值*******”,videoFiles.toString());
System.out.println(媒体路径);
if(videoFiles.isDirectory()){
fileList=videoFiles.list();
}
if(fileList==null){
System.out.println(“文件不退出”);
Toast.makeText(这个“没有文件”,Toast.LENGTH_SHORT.show();
}否则{
System.out.println(“文件列表*************”+文件列表);
for(int i=0;ipackage com.oneplc.viessmannapp;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import wseemann.media.FFmpegMediaMetadataRetriever;
import android.media.ThumbnailUtils;
import android.provider.MediaStore;
import android.widget.GridView;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class VideoListActivity extends Activity {
private static ProgressDialog pDialog;
private static String MEDIA_PATH;
String[] fileList = null;
ListView mList;
String FILE_PATH;
String MIME_TYPE = "video/mp4";
private ImageView goBack;
private static Context mContext;
private ImageAdapter mAdapter;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
mAdapter.notifyDataSetChanged();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_list);
goBack = (ImageView) findViewById(R.id.back_btn);
mContext = this;
setActionListeners();
String folder = getIntent().getStringExtra("folder");
MEDIA_PATH = new String(Environment.getExternalStorageDirectory().getPath() + "/"+folder+"/");
updateVideoList();
FILE_PATH = Environment.getExternalStorageDirectory().getPath() + "/"+folder+"/";
mList = (ListView) findViewById(R.id.listView1);
if(fileList !=null){
mAdapter = new ImageAdapter(this, fileList);
mList.setAdapter(mAdapter);
}
mList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
Toast.makeText(
getApplicationContext(),
((TextView) v.findViewById(R.id.item_title))
.getText(), Toast.LENGTH_SHORT).show();
String videoFilePath = FILE_PATH + fileList[position];
System.out.println("******************************videoFilePath****************" + videoFilePath);
System.out.println("******************************MiME_TYPE****************"+ MIME_TYPE);
// Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
// File newFile = new File(videoFilePath);
// intent.setDataAndType(Uri.fromFile(newFile), MiME_TYPE);
// startActivity(intent);
Intent intent = new Intent(VideoListActivity.this, VideoViewActivity.class);
intent.putExtra("videopath", videoFilePath);
startActivity(intent);
}
});
}
private void setActionListeners() {
// TODO Auto-generated method stub
goBack.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi")
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
//Clear up VM heap stack
System.gc();
finish();
}
});
}
public static String FormatDate(Date yourDate) {
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss",Locale.US);
return sdf.format(yourDate);
}
public void updateVideoList() {
File videoFiles = new File(MEDIA_PATH);
Log.d("*********Value of videoFiles******", videoFiles.toString());
System.out.println(MEDIA_PATH);
if (videoFiles.isDirectory()) {
fileList = videoFiles.list();
}
if (fileList == null) {
System.out.println("File doesnot exit");
Toast.makeText(this, "There is no file", Toast.LENGTH_SHORT).show();
} else {
System.out.println("fileList****************" + fileList);
for (int i = 0; i < fileList.length; i++) {
Log.e("Video:" + i + " File name", fileList[i]);
}
}
}
public static Bitmap scaleBimtap(Bitmap bitmap, int width, int height) {
final int bitmapWidth = bitmap.getWidth();
final int bitmapHeight = bitmap.getHeight();
final float scale = Math.min((float) width / (float) bitmapWidth,
(float) height / (float) bitmapHeight);
final int scaledWidth = (int) (bitmapWidth * scale);
final int scaledHeight = (int) (bitmapHeight * scale);
final Bitmap decoded = Bitmap.createScaledBitmap(bitmap, scaledWidth, scaledHeight, true);
return decoded;
}
private class ProcessImageTask extends AsyncTask<Void, Void, Bitmap> {
private Handler mHandler;
private ImageView mImageView;
private String mUri;
public ProcessImageTask(Handler handler, ImageView imageView, String uri) {
mHandler = handler;
mImageView = imageView;
mUri = uri;
}
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(mContext);
pDialog.setMessage("Loading Playlist...");
pDialog.show();
}
@Override
protected Bitmap doInBackground(Void... v) {
FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
mmr.setDataSource(mUri);
//here you change the thumbnail frame
Bitmap bmThumbnail = mmr.getFrameAtTime(2000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); // frame at 2 seconds
if(bmThumbnail !=null){
scaleBimtap(bmThumbnail, 20, 20);
}
mmr.release();
//-----------------
return bmThumbnail;
}
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
//-----------------
if (bitmap != null) {
System.out
.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>> THUMB NAIL>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
mImageView.setImageBitmap(bitmap);
mHandler.sendEmptyMessage(0);
} else {
System.out
.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>NO THUMB NAIL>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
pDialog.dismiss();
}
}
public class ImageAdapter extends BaseAdapter {
private final Context context;
private final String[] VideoValues;
public ImageAdapter(Context context, String[] VideoValues) {
this.context = context;
this.VideoValues = VideoValues;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("***********IngetView************");
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View listview;
if (convertView == null) {
listview = new View(context);
listview = inflater.inflate(R.layout.gridlayout, null);
TextView textView = (TextView) listview
.findViewById(R.id.item_title);
TextView tv_time = (TextView) listview
.findViewById(R.id.tv_time);
textView.setText(fileList[position]);
System.out.println("value of fileList[position]" + fileList[0]);
// set image
ImageView imageThumbnail = (ImageView) listview
.findViewById(R.id.item_image);
int msec = MediaPlayer.create(context, Uri.fromFile(new File(FILE_PATH + fileList[position]))).getDuration();
tv_time.setText(FormatDate(new Date(msec)));
System.out
.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>> file path>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+ fileList[position]);
/*FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
mmr.setDataSource(FILE_PATH + fileList[position]);
//here you change the thumbnail frame
Bitmap bmThumbnail = mmr.getFrameAtTime(2000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); // frame at 2 seconds
mmr.release();
//-----------------
if (bmThumbnail != null) {
System.out
.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>> THUMB NAIL>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
imageThumbnail.setImageBitmap(bmThumbnail);
} else {
System.out
.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>NO THUMB NAIL>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}*/
new ProcessImageTask(mHandler, imageThumbnail, FILE_PATH + fileList[position]).execute();
} else {
listview = convertView;
}
return listview;
}
@Override
public int getCount() {
// return 0;
return VideoValues.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
}
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
//-----------------
if (bitmap != null) {
System.out
.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>> THUMB NAIL>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
mImageView.setImageBitmap(bitmap);
mHandler.sendEmptyMessage(0);
} else {
System.out
.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>NO THUMB NAIL>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
pDialog.dismiss();
}
pDialog = new ProgressDialog(mContext);
private static ProgressDialog pDialog;
private static int pDialogCounter = 0;
protected void onPreExecute(){
super.onPreExecute();
if(pDialog == null) {
pDialog = new ProgressDialog(mContext);
pDialog.setMessage("Loading Playlist...");
pDialog.show();
}
++pDialogCounter;
}
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
...
if(--pDialogCounter == 0) {
pDialog.dismiss();
pDialog = null;
}
}
ProgressDialog dialog;
protected void onPreExecute() {
dialog = ProgressDialog.show(importExportActivity.this, "",
"Loading Playlist...", true);
}
@Override
protected void onPostExecute(final Void success) {
dialog.dismiss();
}