我是Android开发的初学者,我正在开发一个项目,为此我需要使用异步任务将PDF文件从URL下载到我的手机,同时我需要显示<正在下载文件时强>进度对话。
以下是我的MainActivity.java的内容..
public class MainActivity extends Activity {
String[] listItem;
String[] listItemURLs;
ProgressDialog mProgressDialog;
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diff_view1);
// instantiate it within the onCreate method
mProgressDialog = new ProgressDialog(MainActivity.this);
mProgressDialog.setMessage("Downloading file..please wait.");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
listItem = new String[] { "File 1", "File 2", "File 3", "File 4",
"File 5", "File 6", "File 7" };
listItemURLs = new String[] { "http://www.ztsinc.com/MBTLA2_ds.pdf",
"http://www.ztsinc.com/MBT1_ds.pdf",
"http://www.ztsinc.com/MINIMBT_ds.pdf",
"http://www.ztsinc.com/MINI9R_ds.pdf",
"http://www.ztsinc.com/MBTLA2_OI.pdf",
"http://www.ztsinc.com/MBT1_OI.pdf",
"http://www.ztsinc.com/MINIMBT_MINI9R_OI.pdf" };
lv = (ListView) findViewById(R.id.listview1);
lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_list_item_1, listItem));
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view,
final int position, long id) {
AlertDialog.Builder da = new AlertDialog.Builder(
MainActivity.this);
da.setMessage("Do you want to download this file?");
da.setPositiveButton("YES", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
downloadPDF downloadpdf = new downloadPDF(view,
position);
downloadpdf.execute(listItemURLs[position]);
}
});
da.setNegativeButton("No", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
da.show();
}
});
}
public class downloadPDF extends AsyncTask<String, Integer, String> {
private View mView;
private int mPosition;
public downloadPDF(View view, int position) {
mView = view;
mPosition = position;
}
@Override
public void onPreExecute() {
super.onPreExecute();
mProgressDialog.show();
}
String fileName = listItem[mPosition];
String fileExtension=".pdf";
@Override
protected String doInBackground(String... sUrl) {
try {
URL url = new URL(sUrl[mPosition]);
HttpURLConnection connection =(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.connect();
String PATH = Environment.getExternalStorageDirectory() + "/download/";
File file = new File(PATH);
file.mkdirs();
File outputFile = new File(file,fileName + fileExtension);
FileOutputStream fos = new FileOutputStream(outputFile);
InputStream is = connection.getInputStream();
// this will be useful so that you can show a typical 0-100%
// progress bar
int fileLength = connection.getContentLength();
// download the file
byte buffer[] = new byte[1024];
long total = 0;
int len1 = 0;
while ((len1 = is.read(buffer)) != -1) {
total += len1;
// publishing the progress....
publishProgress((int) (total * 100 / fileLength));
fos.write(buffer, 0, len1);
}
fos.flush();
fos.close();
is.close();
} catch (Exception e) {
}
return null;
}
public void onPostExecute(Integer... progress) {
super.onProgressUpdate(progress);
mProgressDialog.setProgress(progress[0]);
Toast.makeText(MainActivity.this, "Download Complete",
Toast.LENGTH_SHORT).show();
mProgressDialog.dismiss();
}
}
}
我的diff_view1.xml就是这样......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:weightSum="1" >
<ListView
android:id="@+id/listview1"
android:layout_width="fill_parent"
android:layout_height="400dp" >
</ListView>
<Button
android:id="@+id/btnDownload"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Download"
android:layout_marginTop="30dp"/>
</LinearLayout>
我还在我的清单中为互联网,SD卡写入等添加了权限。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.testProject.imageCheck"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".MainActivity"
android:label="Titles/Styled (via theme)"
android:theme="@style/StyledIndicators" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我有一个listview填充了一个数组适配器,其中包含“File 1”,“File 2”等元素。 我正在使用“URL”(存储在数组中的那些)作为争论启动异步任务的对象,但是当我运行并单击任何listview项时,进度条只会停留在0%,然后没有任何反应。谁能帮我?这样做已经好几个小时但没有成功:(
谢谢。
答案 0 :(得分:1)
使用以下代码。
public class DownloaderThread extends Thread
{
// constants
private static final int DOWNLOAD_BUFFER_SIZE = 4096;
// instance variables
private AndroidFileDownloader parentActivity;
private String downloadUrl;
/**
* Instantiates a new DownloaderThread object.
* @param parentActivity Reference to AndroidFileDownloader activity.
* @param inUrl String representing the URL of the file to be downloaded.
*/
public DownloaderThread(AndroidFileDownloader inParentActivity, String inUrl)
{
downloadUrl = "";
if(inUrl != null)
{
downloadUrl = inUrl;
}
parentActivity = inParentActivity;
}
/**
* Connects to the URL of the file, begins the download, and notifies the
* AndroidFileDownloader activity of changes in state. Writes the file to
* the root of the SD card.
*/
@Override
public void run()
{
URL url;
URLConnection conn;
int fileSize, lastSlash;
String fileName;
BufferedInputStream inStream;
BufferedOutputStream outStream;
File outFile;
FileOutputStream fileStream;
Message msg;
// we're going to connect now
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_CONNECTING_STARTED,
0, 0, downloadUrl);
parentActivity.activityHandler.sendMessage(msg);
try
{
url = new URL(downloadUrl);
conn = url.openConnection();
conn.setUseCaches(false);
fileSize = conn.getContentLength();
// get the filename
lastSlash = url.toString().lastIndexOf('/');
fileName = "file.bin";
if(lastSlash >=0)
{
fileName = url.toString().substring(lastSlash + 1);
}
if(fileName.equals(""))
{
fileName = "file.bin";
}
// notify download start
int fileSizeInKB = fileSize / 1024;
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_DOWNLOAD_STARTED,
fileSizeInKB, 0, fileName);
parentActivity.activityHandler.sendMessage(msg);
// start download
inStream = new BufferedInputStream(conn.getInputStream());
outFile = new File(Environment.getExternalStorageDirectory() + "/" + fileName);
fileStream = new FileOutputStream(outFile);
outStream = new BufferedOutputStream(fileStream, DOWNLOAD_BUFFER_SIZE);
byte[] data = new byte[DOWNLOAD_BUFFER_SIZE];
int bytesRead = 0, totalRead = 0;
while(!isInterrupted() && (bytesRead = inStream.read(data, 0, data.length)) >= 0)
{
outStream.write(data, 0, bytesRead);
// update progress bar
totalRead += bytesRead;
int totalReadInKB = totalRead / 1024;
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_UPDATE_PROGRESS_BAR,
totalReadInKB, 0);
parentActivity.activityHandler.sendMessage(msg);
}
outStream.close();
fileStream.close();
inStream.close();
if(isInterrupted())
{
// the download was canceled, so let's delete the partially downloaded file
outFile.delete();
}
else
{
// notify completion
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_DOWNLOAD_COMPLETE);
parentActivity.activityHandler.sendMessage(msg);
}
}
catch(MalformedURLException e)
{
String errMsg = parentActivity.getString(R.string.error_message_bad_url);
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_ENCOUNTERED_ERROR,
0, 0, errMsg);
parentActivity.activityHandler.sendMessage(msg);
}
catch(FileNotFoundException e)
{
String errMsg = parentActivity.getString(R.string.error_message_file_not_found);
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_ENCOUNTERED_ERROR,
0, 0, errMsg);
parentActivity.activityHandler.sendMessage(msg);
}
catch(Exception e)
{
String errMsg = parentActivity.getString(R.string.error_message_general);
msg = Message.obtain(parentActivity.activityHandler,
AndroidFileDownloader.MESSAGE_ENCOUNTERED_ERROR,
0, 0, errMsg);
parentActivity.activityHandler.sendMessage(msg);
}
}
}
以上代码摘自以下链接的项目。
答案 1 :(得分:1)
在publishProgress(...)
之后, onProgressUpdate
将在AsyncTask类中调用,您应该更新进度。
// Use this method in your downloadPDF class
protected void onProgressUpdate(String... progress) {
// setting progress percentage
mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}