6

我的应用程序启动一个AsyncTask从 URL 下载文件的应用程序。同时它会创建一个状态栏Notification,告诉用户下载完成的百分比。

我试图让我的应用程序响应单击通知。如果下载仍在进行中,我想显示一个DialogInterface询问他们是否要停止下载。单击是应该停止下载。

我遇到的问题是我不确定如何从PendingIntent我为通知设置的访问我的异步任务。我可以DialogInterface很容易地显示,但我不确定如何显示正在停止下载的活动。

我尝试创建一个可以访问通知的 Helper 类以及引用可下载文件的 File 对象,但是我收到一条错误消息,指出该对象不可序列化(它确实实现了Serializable)。助手类还包括一个成员,该成员将保存下载进度,这是我将用于是否显示对话框的条件。

我正在考虑使用 Brodcast Action 和接收器,但我不确定将接收器放在哪里。它会进入扩展的类AsyncTask吗?

任何帮助,将不胜感激。这是PendingIntent附在Notification. 如果您想查看更多代码,请询问。

public class DownloadNotificationActivity extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate( Bundle savedInstanceState ) {
    super.onCreate( savedInstanceState );

    Intent i = getIntent();

    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {

        @Override
        public void onClick( DialogInterface dialog, int which ) {
            switch ( which ) {
                case DialogInterface.BUTTON_POSITIVE :
                    // Yes button clicked
                    // Stop download
                    finish();
                    break;

                case DialogInterface.BUTTON_NEGATIVE :
                    // No button clicked
                    finish();
                    break;
            }
        }
    };

    if ( /* download not complete */ ) {
        AlertDialog.Builder builder = new AlertDialog.Builder( this );
        builder.setMessage( R.string.stop_download ).
                setPositiveButton( R.string.yes, dialogClickListener ).
                setNegativeButton( R.string.no, dialogClickListener ).show();
    }
    else {
        // Access file
    }

}
}

所以说清楚,我有一ViewDetailActivity堂课。它有一个名为的内部类,当用户单击屏幕上的按钮时,DownloadFile它会扩展并执行。AsyncTask在 的doInBackground()方法中DownloadFile,从 URL 开始下载 mp3,Notification并根据下载的文件量创建和更新状态栏。的PendingIntentNotificationDownloadNotificationActivity(显示的代码)创建的,它应该显示一个对话框,选择“是”,应该取消AsyncTask.

我的问题是我需要回复DownloadFile已取消下载的任务,但我不确定如何DownloadFile从该任务DownloadNotificationActivity中访问以取消它。

提前致谢!

4

1 回答 1

1

在您的asynctask中,您需要在取消时检查isCancelled()doInBackground()中止。从您的通知中,您调用cancel().asynctask

为此,您需要将引用传递AsyncTask给您的通知活动。

例如:

您可以像这样创建 AsyncTask:

class MyAsyncTask extends AsyncTask<Void, Integer, Void> {
        @Override
        protected Void doInBackground(Void... unused) { //be sure to check isCancelled here, i.e. if (isCancelled()) break;

然后在您的主目录中Activity创建AsyncTask类似的内容:

public class MyActivity extends Activity {
    private MyAsyncTask zeTask;
    @Override
    public void onCreate(Bundle savedInstanceState) {
              zeTask= new MyAsyncTask();
              zeTask.execute();

然后,当您创建通知并想取消异步任务时,只需将其称为 zeTask。MyAsyncTask 需要与通知在同一个活动中,并且 zeTask 可以是保存对 AsyncTask 的引用的变量。

switch ( which ) {
                case DialogInterface.BUTTON_POSITIVE :
                    zeTask.cancel();
                    finish();
                    break;
于 2012-06-12T18:55:05.847 回答