0

我必须使用 android 服务从 url 下载图像文件。该文件已下载,但是当我尝试在通知中添加进度条以便我可以看到我的设备挂起的下载进度或一段时间进度条继续运行并且没有下载文件时。我怎样才能实现?

编码 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();






    }


}
4

2 回答 2

0

可能是你的通知太频繁了。这就是它冻结的原因。使它们以更大的间隔更新。确定是每秒或 2 秒一次。
还要检查通知服务中的 android 内存泄漏

于 2012-09-19T07:24:29.370 回答
0

这个话题太老了。但我希望有人能得到对我有用的帮助。

DownloadManager在 android 中使用过,它是在 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);

您可以DownloadManagerAndroid 开发者网站了解更多信息,并按照此处的教程进行操作

于 2016-06-20T05:58:39.277 回答