我在android中使用DownloadManager启动多个文件下载。
我从Gridview
中选择了该项目,然后使用FOR loop
在Fragment-Gridview
中发送下载文件请求。
它将创建一个新的Fragment-Download
,然后开始下载。
下载完成/失败后或button
取消。
关闭Fragment-Download
并返回Fragment-Gridview
。
然后我从GridView
中选择项目并再次发送请求。
它有如下日志的错误:
I/ActivityManager( 568): Process android.process.media (pid 10027) has died.
W/ActivityManager( 568): Service crashed 2 times, stopping: ServiceRecord{43db4e90 com.android.providers.media/.MtpService}
W/ActivityManager( 568): Service crashed 2 times, stopping: ServiceRecord{44ae10b0 com.android.providers.downloads/.DownloadService}
W/InputMethodManagerService( 568): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@4232f8c0 attribute=android.view.inputmethod.EditorInfo@426ea268
I/ActivityManager( 568): Start proc android.process.media for content provider com.android.providers.downloads/.DownloadProvider: pid=10344 uid=10018 gids={1015, 1023, 1024, 1028, 2001, 3003, 3007}
E/Trace (10344): error opening trace file: No such file or directory (2)
D/ActivityThread(10344): setTargetHeapUtilization:0.25
D/ActivityThread(10344): setTargetHeapIdealFree:8388608
D/ActivityThread(10344): setTargetHeapConcurrentStart:2097152
I/ActivityThread(10344): Pub downloads: com.android.providers.downloads.DownloadProvider
然后我无法取消下载并在此错误后删除。
我应该关闭downloadManager还是刷新/释放资源以避免此问题?
我该怎么办?
----------------------------------------------- ----- EDIT -----------------------------------------
以下代码适用于download fragment
DownloadFileListTask
将读取该文件并将该项目添加到GridView
newInstance
将项目提供给DownloadFileListTask
主要下载代码位于final Runnable startMultipleDownload = new Runnable()
读取文件完成后,将调用startMultipleDownload
开始下载。
startMultipleDownload
会调用mHandler.postDelayed(Download_Update, 200);
来更新下载百分比。
在Download_Update
中,它会在更新下载百分比后调用mHandler.post(Check_Download_State);
。
package tw.com.a_i_t.IPCamViewer.FileBrowser;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import tw.com.a_i_t.IPCamViewer.MainActivity;
import tw.com.a_i_t.IPCamViewer.R;
import tw.com.a_i_t.IPCamViewer.FileBrowser.FileBrowserFragment.FileListAdapter;
import tw.com.a_i_t.IPCamViewer.FileBrowser.Model.FileNode;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.app.Fragment;
import android.content.Context;
import android.content.DialogInterface;
import android.view.View.OnKeyListener;
import android.database.Cursor;
import android.net.DhcpInfo;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.MimeTypeMap;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.AbsListView.MultiChoiceModeListener;
public class DownloadPage extends Fragment implements MultiChoiceModeListener{
private ProgressBar loading;
public static ProgressBar download_progress;
private Map<Integer, Boolean> mSelectMap = new HashMap<Integer, Boolean>();
public static final String DEFAULT_PATH = "/cgi-bin/Config.cgi" ;
public static final String DEFAULT_DIR = "DCIM" ;
private static int index;
private static final String TAG = "MJPEG Player" ;
private static Handler mHandler;
private static Cursor cursor;
private static FileNode SingleFile;
private static int[] temp_position = new int[1000];
private static long[] cancal_download_position = new long[1000];
private TextView mActionText;
public static TextView download_percent;
private GridView fileListView;
private ImageButton cancel_download;
private ImageButton cancel_download_all;
private static final int MENU_SELECT_ALL = 0;
private static final int MENU_UNSELECT_ALL = MENU_SELECT_ALL + 1;
public static long downloadID = 0;
private static SparseBooleanArray item;
private List<FileNode> fileList;
//final DownloadPage downloadfragment = new DownloadPage();
private class DownloadFileListTask extends AsyncTask<FileBrowser, Integer, FileBrowser> {
@Override
protected void onPreExecute() {
setWaitingState(true) ;
mFileList.clear() ;
mFileListTitle.setText(mFileBrowser + " : " + mReading + " " + mDirectory) ;
super.onPreExecute() ;
}
@Override
protected FileBrowser doInBackground(FileBrowser... browsers) {
browsers[0].retrieveFileList(mDirectory, FileNode.Format.all, true) ;
return browsers[0] ;
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(FileBrowser result) {
Activity activity = getActivity() ;
if (activity != null) {
fileList = result.getFileList() ;
if(item != null){
for(int i = 0 ; i<item.size() ; i++){
FileNode list = fileList.get(temp_position[i]);
mFileList.add(i, list);
Log.i(TAG, "DownloadFile--mFileList.get(i) = " + mFileList.get(i));
}
}
}
}
}
private String mIp ;
private String mPath ;
private String mDirectory ;
private static final String KEY_IP = "ip" ;
private static final String KEY_PATH = "path" ;
private static final String KEY_DIRECTORY = "directory" ;
private static ArrayList<FileNode> mFileList = new ArrayList<FileNode>() ;
private TextView mFileListTitle ;
private String mFileBrowser ;
private String mReading ;
private String mItems ;
public static DownloadPage newInstance(String ip, String url, String directory, SparseBooleanArray checkedItems) {
DownloadPage fragment = new DownloadPage() ;
Bundle args = new Bundle() ;
if (ip != null)
args.putString(KEY_IP, ip) ;
if (url != null)
args.putString(KEY_PATH, url) ;
if (directory != null)
args.putString(KEY_DIRECTORY, directory) ;
item = null;
item = checkedItems;
Log.i(TAG, "MultipleItem--newInstance---item = " + item);
Log.i(TAG, "MultipleItem--newInstance---checkedItems = " + checkedItems.size());
if (checkedItems != null) {
for (int i=0; i<checkedItems.size(); i++) {
if (checkedItems.valueAt(i)) {
temp_position[i] = checkedItems.keyAt(i);
}
}
}
fragment.setArguments(args) ;
return fragment ;
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
mIp = getArguments().getString(KEY_IP) ;
if (mIp == null) {
WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE) ;
DhcpInfo dhcpInfo = wifiManager.getDhcpInfo() ;
if (dhcpInfo != null && dhcpInfo.gateway != 0) {
mIp = MainActivity.intToIp(dhcpInfo.gateway) ;
}
}
mPath = getArguments().getString(KEY_PATH) ;
if (mPath == null) {
mPath = DEFAULT_PATH ;
}
mDirectory = getArguments().getString(KEY_DIRECTORY) ;
if (mDirectory == null) {
mDirectory = DEFAULT_DIR ;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
final View view = inflater.inflate(R.layout.download_page, container, false);
mHandler = new Handler();
loading = (ProgressBar) view.findViewById(R.id.loading);
mFileBrowser = getActivity().getResources().getString(R.string.label_file_browser) ;
mReading = getActivity().getResources().getString(R.string.label_reading) ;
mItems = getActivity().getResources().getString(R.string.label_items) ;
mFileListTitle = (TextView) view.findViewById(R.id.browserTitle) ;
mFileListTitle.setText(mFileBrowser + " : " + mDirectory) ;
//Ampak++++++++++++++++++++++++++++++++++++++++++++++++++++++
fileListView = (GridView) view.findViewById(R.id.browserList) ;
fileListView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
fileListView.setMultiChoiceModeListener((MultiChoiceModeListener) this);
fileListView.setNumColumns(3);
download_progress = (ProgressBar) view.findViewById(R.id.download_progress);
download_percent = (TextView) view.findViewById(R.id.Download_Percent);
return view;
}
private boolean mWaitingState = false ;
private boolean mWaitingVisible = false ;
//download the multiple file
final Runnable startMultipleDownload = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (item != null) {
for (int i=0; i<item.size(); i++) {
if (item.valueAt(i)) {
Log.i(TAG, "startMultipleDownload--item.size() = " + item.size());
Log.i(TAG, "startMultipleDownload--item.valueAt(i) = " + item.size());
FileNode file = mFileList.get(i) ;
final String filename = file.mName.substring(file.mName.lastIndexOf("/") + 1) ;
final String urlString = "http://" + mIp + file.mName ;
String serviceString = Context.DOWNLOAD_SERVICE ;
DownloadManager downloadManager = (DownloadManager) getActivity().getSystemService(
serviceString) ;
Uri uri = Uri.parse(urlString) ;
DownloadManager.Request request = new Request(uri) ;
request.setTitle(filename) ;
request.setDescription(urlString) ;
String ext = filename.substring(filename.lastIndexOf(".") + 1)
.toLowerCase(Locale.US) ;
String mimeType = MimeTypeMap.getSingleton()
.getMimeTypeFromExtension(ext) ;
Log.i("MIME", ext + " ==> " + mimeType) ;
if (mimeType != null) {
request.setMimeType(mimeType) ;
}
request.allowScanningByMediaScanner() ;
request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) ;
request.setDestinationInExternalPublicDir(MainActivity.sAppName, filename) ;
cancal_download_position[i] = downloadManager.enqueue(request);
downloadID = cancal_download_position[i];
Log.i(TAG, "startMultipleDownload--downloadID = " + downloadID);
mHandler.postDelayed(Download_Update, 200);
}
}
}
}
};
final Runnable Download_Update = new Runnable() {
//update the download percent
@Override
public void run() {
// TODO Auto-generated method stub
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(downloadID);
String serviceString = Context.DOWNLOAD_SERVICE ;
DownloadManager downloadManager = (DownloadManager) getActivity().getSystemService(
serviceString) ;
cursor = downloadManager.query(q);
try {
if(cursor.moveToFirst()){
int byte_download = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
int byte_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
int download_percent_text = (byte_download*100)/byte_total;
download_percent.setText(download_percent_text + "%");
download_progress.setProgress(download_percent_text);
index = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
mHandler.post(Check_Download_State);
//call "Check_Download_State"(check the is download finish or failed ) after update the download percent
}
cursor.close();
} catch (Exception e) {
// TODO: handle exception
}
mHandler.postDelayed(this, 200);
}
};
final Runnable Check_Download_State = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
index = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
//If file download finish or failed , stop handler "Download_Update"(update the download percent)
if(DownloadManager.STATUS_SUCCESSFUL == cursor.getInt(index)){
Log.i(TAG, "Check_Download_State-- SUCCESSFUL--cursor.getInt(index)" + cursor.getInt(index));
mHandler.removeCallbacks(Download_Update);
}else if(DownloadManager.STATUS_FAILED == cursor.getInt(index)){
Log.i(TAG, "Check_Download_State-- FAILED--cursor.getInt(index)" + cursor.getInt(index));
mHandler.removeCallbacks(Download_Update);
}
}
};
private void setWaitingState(boolean waiting) {
if (mWaitingState != waiting) {
mWaitingState = waiting ;
Log.i(TAG, "setWaitingState-----waiting = " + waiting);
//Log.i(TAG, "setWaitingState-----item.size() = " + item.size());
if(mWaitingState == false){
if(item.size() >= 0){
mHandler.post(startMultipleDownload);
}
}
setWaitingIndicator(mWaitingState, mWaitingVisible) ;
}
}
private void setWaitingIndicator(boolean waiting, boolean visible) {
if (!visible)
return ;
Activity activity = getActivity() ;
if (activity != null) {
activity.setProgressBarIndeterminate(true) ;
activity.setProgressBarIndeterminateVisibility(waiting) ;
Log.i(TAG, "waiting = " + waiting);
if(waiting == true){
loading.setVisibility(View.VISIBLE);
}else if(waiting == false){
loading.setVisibility(View.GONE);
}
}
}
private void clearWaitingIndicator() {
mWaitingVisible = false ;
Log.i(TAG, "clearWaitingIndicator---waiting = " + false);
setWaitingIndicator(false, true) ;
}
private void restoreWaitingIndicator() {
mWaitingVisible = true ;
Log.i(TAG, "restoreWaitingIndicator---waiting = " + mWaitingState);
setWaitingIndicator(mWaitingState, true) ;
}
private void closefragment() {
getActivity().getFragmentManager().popBackStack();
}
@Override
public void onResume() {
mFileList.clear() ;
restoreWaitingIndicator() ;
try {
new DownloadFileListTask().execute(new FileBrowser(new URL("http://" + mIp + mPath),
FileBrowser.COUNT_MAX)) ;
} catch (MalformedURLException e) {
e.printStackTrace() ;
}
super.onResume() ;
Log.i(TAG, "Download----onResume");
}
@Override
public void onPause() {
clearWaitingIndicator() ;
Log.i(TAG, "Download----onPause");
super.onPause() ;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
item = null;
downloadID = 0;
mHandler.removeCallbacks(startMultipleDownload);
mHandler.removeCallbacks(Download_Update);
Log.i(TAG, "Download----onDestroy");
super.onDestroy();
}
private String formatString(int count) {
return String.format(getString(R.string.selection), count);
}
}