Make Downloader在后台和upading进度条下载文件

时间:2012-11-07 12:34:28

标签: android service

我想开发文件下载器应用程序。哪个下载文件列表。当我将文件添加到下载列表时,它会定期更新进度。 我关闭所有活动并再次运行应用程序,然后我的应用程序列出所有当前下载的连续进度栏

我该怎么做?

我正在使用此异步任务来下载文件

class DownloadFileFromURL extends AsyncTask<String, String, String> {
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected String doInBackground(String... f_url) {
                int count;
                try {
                    URL url = new URL(f_url[0]);
                    URLConnection conection = url.openConnection();
                    conection.connect();
                    // getting file length
                    lenghtOfFile = conection.getContentLength();

                    // input stream to read file - with 8k buffer
                    InputStream input = new BufferedInputStream(
                            url.openStream(), 8192);
                    OutputStream output = null;

                    if (space_avaliable) {
                        File dir = new File(
                                Utill.saveFile(CustomGroupTabActivity.mTabHost
                                        .getContext()) + "/tocaonline");
                        if (!dir.exists()) {
                            dir.mkdirs();
                        }
                        // Output stream to write file
                        output = new FileOutputStream(
                                Utill.saveFile(CustomGroupTabActivity.mTabHost
                                        .getContext())
                                        + "/tocaonline/"
                                        + "test.mp3");

                        byte data[] = new byte[1024];

                        long total = 0;

                        while ((count = input.read(data)) != -1) {
                            total += count;
                            // publishing the progress....
                            // After this onProgressUpdate will be called
                            publishProgress(""
                                    + (int) ((total * 100) / lenghtOfFile));

                            // writing data to file
                            output.write(data, 0, count);
                        }

                        // flushing output
                        output.flush();
                    }

                    // closing streams
                    output.close();
                    input.close();

                } catch (Exception e) {
                    Log.e("Error: ", e.getMessage());
                }

                return null;
            }

            protected void onProgressUpdate(String... progress) {
                // setting progress percentage
                p_bar.setProgress(Integer.parseInt(progress[0]));
            }

            @SuppressWarnings("unchecked")
            @Override
            protected void onPostExecute(String file_url) {

            }
        }

当我点击添加到下载按钮,然后我将动态视图添加到线性布局。

LinearLayout lytParent = (LinearLayout) findViewById(R.id.boxset_parentview);
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater = LayoutInflater.from(CustomGroupTabActivity.mTabHost
                .getContext());

        View convertview = inflater.inflate(R.layout.raw_set_detail, null);

final ProgressBar p_bar = (ProgressBar) convertview
                .findViewById(R.id.rawsetdetails_sync_progress);

lytParent.addView(convertview);

当我的活动处于活动状态时,它运行良好。但是当我关闭所有活动并再次运行此活动时,我想通过活动下载显示实际的下载进度。

2 个答案:

答案 0 :(得分:3)

这是如何实现的:

1)运行后台服务进行下载。这个link为您提供服务的基础知识。它将使用线程池进行多个活动下载。它将以块的形式读取数据并将块读取事件发送到注册侦听器,以便活动可以更新其UI。

2)每当您想下载时,请使用项目名称,项目ID和http链接将请求发送到服务。服务将为每次下载保留这三项内容以及下载的总大小和下载的字节数。

3)现在,无论何时启动活动(让调用是下载管理器屏幕),都要求服务提供当前活动和排队下载。 service将提供下载项列表(项目名称,项目ID,项目http链接,项目总大小和下载的字节数),您可以使用它来使用ListView创建视图。您可以使用项目总大小和下载字节数来创建进度条。

4)通过服务注册块读取事件。因此,服务将在每个块读取下载请求后通知活动,其中包括项目名称,项目ID,项目http链接,项目总大小和下载的字节数。使用此信息更新活动中的项目列表,并通知适配器已更改为数据的数据将更新列表视图。

5)在活动关闭时取消注册事件监听器。

答案 1 :(得分:0)

我假设您正在使用ListView。
在这种情况下,您必须在getView()中添加代码,例如:
如果下载正在运行:show progressBar
否则:隐藏progressBar。

这是因为如果可能,Android会重新使用视图,因此可能错误地仍然是Visibile。