0

我正在尝试实现一些功能,例如文件下载,下载启动按钮位于某些列表视图中。为了更清楚,这里用图表来说明。

首先,我在那里输入带有一些列表视图的 Book1_Activity: [book_chapter_name_1 [download_1]] [book_chapter_name_2 [download_2]] 我点击了 download_1 按钮,下载开始,有一个进度条显示进度。下载是通过 AsyncTask 实现的。

之后,我想切换到其他活动,比如说 book_read_activity,这样我就可以在继续阅读的同时下载一些书籍。

我的问题是我看完书后,想查看下载的书的进度,所以我重新进入Book1_Activity,因为Book1_Activity被销毁并重新创建了,我怎么能得到下载进度并更新呢?</p >

4

3 回答 3

0

考虑改用服务?那么即使关闭也可以运行吗?但是,如果您想继续您的方法,我会让 asynctask 将进度写入全局访问点,然后从那里读取进度。

于 2012-05-02T06:23:15.180 回答
0

这是我一直在使用的东西。我不谈论您的 UI、您的列表框更新等。这只是 Task 和 ProgressDialog 处理:

ProgressDialog 的样式:

<resources>
    <style name="MyProgressDialog" parent="@android:style/Theme.Dialog">
        <item name="android:background">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
        <item name="android:windowTitleStyle">@null</item>
    </style>
</resources>

我的 ProgressDialog 类:

public class MyProgressDialog extends Dialog {

    public MyProgressDialog(Context context) {
        super(context, R.style.MyProgressDialog);
    }

    public static MyProgressDialog show(Context context, CharSequence title, CharSequence message) {
        return show(context, title, message, false);
    }

    public static MyProgressDialog show(Context context, CharSequence title, CharSequence message, boolean indeterminate) {
        return show(context, title, message, indeterminate, false, null);
    }

    public static MyProgressDialog show(Context context, CharSequence title, CharSequence message, boolean indeterminate, boolean cancelable) {
        return show(context, title, message, indeterminate, cancelable, null);
    }

    public static MyProgressDialog show(Context context, CharSequence title, CharSequence message, boolean indeterminate, boolean cancelable, OnCancelListener onCancelListener) {
        MyProgressDialog dialog = new MyProgressDialog(context);
        dialog.setCancelable(cancelable);
        dialog.setOnCancelListener(onCancelListener);
        dialog.setTitle(title);

        dialog.addContentView(new ProgressBar(context), new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        dialog.show();

        return dialog;
    }
}

现在是牛肉。以 AsyncTask 作为内部类的 ListView。AsyncTask 持有对周围 ListActivity(上下文)的引用,而 ListActivity 持有对 AsyncTask 的引用。ProgressDialog 将在通常启动时在 AsyncTask 中创建。如果 ListActivity 停止并且 AsyncTask 仍在运行,则对话框将从 ListActivity 中消失并在重新启动后重新创建。

重要的是要注意谁在做什么:

public class MyListActivity extends ListActivity {

    private class MyAsyncTask extends AsyncTask<Void, Integer, Boolean> {

        /* package */ MyListActivity   context;
        /* package */ MyProgressDialog dialog;

        public MyAsyncTask(MyListActivity context) {
            super();

            this.context = context;
        }

        @Override
        protected Boolean doInBackground(final Void... voids) {
            Boolean rc = false;

            // Put your running task here

            return rc;
        }

        @Override
        protected void onPostExecute(final Boolean result) {
            if (dialog != null) {
                try {
                    dialog.dismiss();
                } catch (Exception exception) {
                }

                dialog = null;
            }

            if (result) {
                // Whatever you need to update in UI
            }

            context.task = null;
        }

        @Override
        protected void onPreExecute () {
            dialog = MyProgressDialog.show(context, null, null, true, false);
        }
    }

    /* package */ MyAsyncTask task;

    // Save AsyncTask if running, dismiss ProgressDialog if open
    @Override
    public Object onRetainNonConfigurationInstance() {
        if (task != null) {
            if (task.dialog != null) {
                task.dialog.dismiss();
                task.dialog = null;
            }
        }

        return task;
    }

    @Override
    public void onCreate(final Bundle bundle) {

        // Usual start here

        // Was task running?
        task = (MyAsyncTask) getLastNonConfigurationInstance();
        if (task != null) {
            // Task was running, update context, restart ProgressDialog
            task.context = this;
            task.dialog = MyProgressDialog.show(this, null, null, true, false);
        } else {
            // Task was not running. Start from beginning
            task = new MyAsyncTask(this);
            task.execute();
        }
    }
于 2012-05-02T07:17:05.670 回答
0

我必须在我的一个应用程序中做同样的事情(使用 API 8)。我选择在通知栏中显示下载进度,并使用服务对其进行更新。对我来说工作得很好。

由于我为 API 8 开发了我的应用程序,因此我无法使用DownloadManager类,但您可能想看看它。如果您的应用程序使用 API 9+,这似乎比自己重新编码流程更合适。

于 2012-05-02T10:34:29.783 回答