1

私のアプリには4つのボタンがあり、ユーザーがボタンのいずれかをクリックすると、ファイルのダウンロードが開始され、進行状況バーが通知領域に表示されます。ダウンロードと進行状況バーは問題なく動作していますが、次の 2 つの問題があります。

  1. ダウンロードが完了しても進行状況バーが閉じず、通知領域に残ります
  2. 上で述べたように、4 つのボタンがあり、最初のボタンをクリックするとダウンロードが開始され、他の 3 つのボタンをクリックするとすぐにダウンロードが行われません。最初のダウンロードが完了した後に開始される可能性があると思いました。しかし、何も起こりません。すべてのボタンがクリックされたときにすべての進行状況バーを表示する方法

以下は私のコードです(ここではボタンを2つだけ追加しました)plsは私を助けてくれます

b1 = (Button)findViewById(R.id.button1);
        b1.setOnClickListener(new View.OnClickListener() 
        {   
            @Override
            public void onClick(View v) 
            {
                i =1;
                Intent intent = new Intent(NotificationProgressTestActivity.this, UploadService.class);
                startService(intent);
            }
        });

        b2 = (Button)findViewById(R.id.button2);
        b2.setOnClickListener(new View.OnClickListener() 
        {   
            @Override
            public void onClick(View v) 
            {
                i = 2;
                Intent intent = new Intent(NotificationProgressTestActivity.this, UploadService.class);
                startService(intent);
            }
        });

次は私のUplaod Service.class です

public class UploadService extends IntentService
{   
    private NotificationManager notificationManager;
    private Notification notification;
    private int progress = 10;
    private static String fileName = "folder/";
    private static URL url;
    public UploadService(String name) 
    {
        super(name);
    }
    public UploadService()
    {
        super("UploadService");
    }
    @Override
    protected void onHandleIntent(Intent intent) 
    {
        notificationManager = (NotificationManager) getApplicationContext().getSystemService(getApplicationContext().NOTIFICATION_SERVICE);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);
        notification = new Notification(R.drawable.icon,"Uploading file", System.currentTimeMillis());
        notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
        notification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.upload_progress_bar);
        notification.contentIntent = contentIntent;
        notification.contentView.setProgressBar(R.id.progressBar1, 100, progress, false);
        notificationManager.notify(42, notification);
        notificationManager.notify(42, notification);
        Thread download = new Thread() 
        {
            @Override
            public void run() 
            {
                Log.e("download", "start");
                try
                {
                    for (int i = 1; i < 100; i++) 
                    {    
                        progress++;
                        notification.contentView.setProgressBar(R.id.progressBar1, 100, progress, false);
                        if(i==1)
                        {  
                            if(NotificationProgressTestActivity.i ==1 )
                            {
                                url = new URL("http://xxxxxxxxxxxxxxxx.mp4");
                            }
                            else if(NotificationProgressTestActivity.i == 2)
                            {
                                url = new URL("http://xxxxxxxxxxxxxxxx.mp4");
                            }
                            HttpURLConnection c = (HttpURLConnection) url.openConnection();
                            c.setRequestMethod("GET");
                            c.setDoOutput(true);
                            c.connect();

                            String PATH = Environment.getExternalStorageDirectory()+ "/";
                            Log.e("PATH:", PATH);
                            File file = new File(PATH);
                            if (!file.exists()) 
                            {
                                file.mkdir();
                                Log.e("destination", "created");
                            } 
                            else 
                            {
                                Log.e("destination", "exist");
                            }
                            File outputFile = new File(file, fileName);
                            FileOutputStream fos = new FileOutputStream(outputFile);

                            InputStream is = c.getInputStream();

                            byte[] buffer = new byte[10171188];
                            int len1 = 0;
                            while ((len1 = is.read(buffer)) != -1) 
                            {
                                fos.write(buffer, 0, len1);
                            }
                            fos.close();
                            is.close();
                            //  -----------------------
                            if (!outputFile.exists()) 
                            {
                                Log.e(outputFile.toString(), "not created");
                            }
                            else 
                            {
                                Log.e(outputFile.toString(), "created");
                                Log.e(outputFile.toString(), "" + outputFile.length());
                            }
                            Log.e("download", "end");
                        }
                        notificationManager.notify(42, notification);
                        try 
                        {
                            Thread.sleep(1017);
                        }
                        catch (InterruptedException e) 
                        {
                            e.printStackTrace();
                        }
                 }
            }
            catch (IOException e) 
            {
                        Log.e("log_tag", "Error: " + e);
            }
            Log.e("log_tag", "Check: ");

                // remove the notification (we're done)
            notificationManager.cancel(42);
        }
     };
        download.run();
    }
4

2 に答える 2

1
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);

1- 上記の行では、getActivity() の 2 番目のパラメーターは requestCode であり、各ボタンの一意の番号である必要があります。現在、両方のボタンで 0 です。

notificationManager.notify(42, notification);

2- 上記の行では、42 として渡している通知インデックスが両方のボタンで一意である必要があります。現在、作成したボタンの数に関係なく、それぞれに 42 を渡しているため、新しい通知が表示されることはありません。現在のものを更新し続けます。

また、onHandleIntent() で実行しているコードをもう一度確認する必要がある場合があります。これを行うためのより良い方法があります。

于 2011-11-20T21:38:18.017 に答える
0

必要なのは とAsyncTaskですListView。ダウンロードマジックは AsyncTask で発生します。たとえば、実行中のダウンロードと実行中の各ダウンロードの進行状況を示す配列を作成します。AsyncTask には、publishProgressを呼び出す -Method がありますonProgressUpdateonProgressUpdateそれぞれの進行状況変数を更新し、ListView アダプターを呼び出す必要がnotifyDataSetChangedあります。これにより、ListView がすべてのデータをリロードします。最後に、ListView-Adapter で Method を取得しましたgetView。ここで、ListView の各行のビューを作成する必要があります。ここで、ProgressBar (ダウンロード実行中) を表示するかどうかを決定できます。

AsyncTaskの詳細については、 http ://labs.makemachine.net/2010/05/android-asynctask-example/ を参照してください 。また、ListView の詳細については、Android : BaseAdapter how to?

于 2011-11-14T08:11:49.403 に答える