1

Asynctask を使用して、Android アプリでファイルをダウンロードしています。全体的にファイルサイズが大きいので、バックグラウンドでファイルのダウンロードを開始します。ダウンロードの進行中にユーザーがアプリの他の部分にアクセスできるように、プログレスバーなどは表示されません。

ファイルのダウンロードが完了したら、ファイルが正常にダウンロードされたことをユーザーに通知したいと思います。

onPostexecute() メソッドを使用すると、ダウンロード プロセスが開始されたときにユーザーが同じアクティビティを行っていないため、問題が発生します。その結果、コンテキストに問題があるため、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
            }
        }
4

3 に答える 3

2

代わりにIntentServiceを使用するのはどうですか...通知を使用できるようにコンテキストがあります..ダイアログボックスは面倒で死ぬ必要があります

于 2013-02-02T15:42:04.707 に答える
1

使うべきだと思います

AlertDialog.Builder ビルダー = new AlertDialog.Builder(getApplicationContext());

あなたのコードで代わりに

于 2013-02-02T15:37:59.373 に答える
0

@QAMAR で指摘されているように、アプリケーション コンテキストと共に通知 (アラート ポップアップではなく、悪い UX) を使用します。

ただし、私たちのアプリでは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());

作業しているアクティビティに影響を与えるために非同期タスクの結果が必要な場合は、バインドされたサービスが必要です。私は今日これらを掘り下げようとしているので、私が持っている洞察を投稿します...

于 2013-02-02T15:47:48.543 に答える