当我使用Asynctask时,如何通知用户文件下载已完成

时间:2013-02-02 15:34:20

标签: android android-asynctask

我正在使用Asynctask在我的Android应用中下载文件。由于文件大小通常很大,我在后台启动文件下载。没有进度条或任何显示的内容,以便用户可以在下载过程中访问应用程序的其他部分。

完成文件下载后,我想通知用户他的文件已成功下载。

使用onPostexecute()方法会产生问题,因为下载过程开始时用户不再处于同一活动中。结果我不能使用Alert对话框&来自onPostExecute()的通知,因为上下文存在问题。

我已粘贴到Asynctask的代码下面。所以,请建议我解决这个问题。

class DownloadProcess extends AsyncTask<Void,Void,Void>{

        Context cxt;

        public DownloadProcess(Context context) {
            cxt=context;
        }


        @Override
        protected Void doInBackground(Void... arg0) {
             try {
                    String fileurl="http://www.bigfiles/" + filenm;
                    URL url = new URL(fileurl); 
                    HttpURLConnection c = (HttpURLConnection) url.openConnection();
                    c.setRequestMethod("GET");
                    c.setDoOutput(true);
                    c.connect();


                    Path = Environment.getExternalStorageDirectory() + "/download/";
                    File pth=new File(Path);
                    File file = new File(pth,filenm);
                    FileOutputStream fos = new FileOutputStream(file);

                    InputStream is = c.getInputStream();

                    byte[] buffer = new byte[1024];
                    int len1 = 0;
                    while ((len1 = is.read(buffer)) != -1) {
                        fos.write(buffer, 0, len1);
                    }
                    fos.close();
                    is.close();

                } catch (IOException e) {
                    Log.d("amit", "Error: " + e);
                }

            return null;
        }


        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            if (((Activity) AppDet.this).isFinishing() == false) {      
                AlertDialog.Builder builder = new AlertDialog.Builder(AppDet.this);
                builder.setMessage("The app download is complete. Please check " +Path+ " on your device and open the " + filenm+ " file downloaded");
                builder.setCancelable(true);
                builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                    });
                AlertDialog alert = builder.create();
                alert.show();
                MediaPlayer md=MediaPlayer.create(AppDet.this, R.raw.ding);
                md.start();
            }
            else {
                //Not sure what to do here
            }
        }

3 个答案:

答案 0 :(得分:2)

如何使用IntentService ...它有一个上下文,所以你可以使用通知..对话框很烦人,必须死掉

答案 1 :(得分:1)

我认为你应该使用

AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());

代码

答案 2 :(得分:0)

使用@QAMAR指出的应用程序上下文通知(不是警报弹出窗口,即不良用户体验)。

但是,在我们的应用中,我们会显示来自android.app.Service的通知来管理任务的子集(我们直接从AsyncTask向UI添加结果 - 他们可能会当你的活动生命周期即将结束时,一个服务可以更明确地控制服务和它的子任务何时结束)

final NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setContentIntent(pendingIntent)
.setSmallIcon(<some drawable>)
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setContentTitle(<some internationalised message>)
.setContentText(<some internationalised subtitle>);

// Send the notification.
((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(<notification id>, builder.getNotification());

如果您需要异步任务的结果来影响您正在使用的活动,那么您需要绑定服务。我今天即将深入研究这些内容,所以我将以任何见解发回...