我必须使用Android服务从网址下载图像文件。该文件已下载,但是当我尝试在通知中添加进度条以便我可以看到下载进度时,我的设备挂起或某个时间进度条继续运行且没有下载文件。我怎样才能实现?
代码Android服务下载文件并在通知中显示进度条
package com.tutorial.app;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.Thread.State;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.util.ByteArrayBuffer;
import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.widget.ProgressBar;
import android.widget.RemoteViews;
public class DownloadProgress extends IntentService {
public DownloadProgress() {
super("");
// TODO Auto-generated constructor stub
}
ProgressBar progressBar;
private List<Integer> progress = new ArrayList<Integer>();
int currentProgress = 5;
// Notification notification;
// NotificationManager notificationManager;
String filepath = "/mnt/sdcard/downloaf/first.jpg";
@Override
protected void onHandleIntent(Intent intent1) {
try {
UpdateProgress();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void UpdateProgress() throws IOException {
Thread download = null;
Intent intent = new Intent(this, DownloadProgress.class);
final PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
@SuppressWarnings("deprecation")
final Notification notification = new Notification(R.drawable.icon, "simulating a download", System
.currentTimeMillis());
notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
notification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.download_progress);
notification.contentIntent = pendingIntent;
notification.contentView.setImageViewResource(R.id.status_icon, R.drawable.ic_menu_save);
notification.contentView.setTextViewText(R.id.status_text, "simulation in progress");
notification.contentView.setProgressBar(R.id.status_progress, 100, currentProgress, false);
final NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(
getApplicationContext().NOTIFICATION_SERVICE);
notificationManager.notify(42, notification);
download = new Thread() {
@Override
public void run() {
for (int i = 1; i < 20; i++) {
currentProgress ++;//+= (progress.get(i)*10)/100;
notification.contentView.setProgressBar(R.id.status_progress, 100, currentProgress, false);
// inform the progress bar of updates in progress
notificationManager.notify(42, notification);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// remove the notification (we're done)
}
};
URL url = new URL("http://www.ilikewallpaper.net/The-new-iPad-wallpapers/download/4755/Assassins-Creed-3-The-new-iPad-wallpaper-ilikewallpaper_com_1024.jpg");
File file = new File(filepath);
URLConnection con = url.openConnection();
long fileLength = con.getContentLength();
InputStream stream = con.getInputStream();
byte[] buff = new byte[5 * 1024];
BufferedInputStream buffer = new BufferedInputStream(stream,1024*5);
FileOutputStream outputStream = new FileOutputStream(file);
int current = 0;
while ((current = buffer.read()) != -1) {
progress.add(current);
synchronized (outputStream) {
download.run();
outputStream.write(buff, 0, current);
notificationManager.cancel(42);
}
}
// download.run();
outputStream.flush();
outputStream.close();
stream.close();
}
}
答案 0 :(得分:1)
这个帖子太旧了。但我希望有人得到帮助,对我有用。
我在android级别中使用DownloadManager
,它在API级别9中添加。它非常易于使用,您无需担心显示通知。只需几行代码
DownloadManager downloadmanager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse("your_any_download_url");
DownloadManager.Request request = new Request(uri);
Long reference = downloadmanager.enqueue(request);
您可以从Android Developer Site了解有关DownloadManager
的更多信息,并按照Here的教程
答案 1 :(得分:0)
可能是您的通知太频繁了。这就是冻结的原因。让它们以更大的间隔更新。好的是每秒钟或2秒钟一次 另请查看android memory leak in notification service