使用AsyncTask冻结UI线程

时间:2011-06-02 02:10:26

标签: android

我正在尝试使用AsyncTask下载包含通知进度的文件。一切正常(在后台线程下载),除非我添加代码以通过publishProgress()更新进度条,它冻结整个手机,直到下载完成并且通知显示“下载完成”。

我完全不知道为什么会这样,但我可能会认为这与我正在使用的publishProgress((downloadedSize / totalSize) * 100)一致?

无论如何,这里是DownloadDataTask

    protected String doInBackground(RomDataSet... params) {
        try {

            // Download file here, all good

            //now, read through the input buffer and write the contents to the file
            while ( (bufferLength = inputStream.read(buffer)) > 0 ) {
                //add the data in the buffer to the file in the file output stream (the file on the sd card
                fileOutput.write(buffer, 0, bufferLength);
                //add up the size so we know how much is downloaded
                downloadedSize += bufferLength;
                //this is where you would do something to report the prgress, like this maybe

                publishProgress((downloadedSize / totalSize) * 100);
            }
            //close the output stream when done
            fileOutput.close();

        //catch some possible errors...
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPreExecute() {
        Intent intent = new Intent(ListActivity.this, ListActivity.class);
        pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);

        // configure the notification
        notification = new Notification(R.drawable.ic_stat_rom, "Downloading Rom via RomGet", System
                .currentTimeMillis());
        notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
        notification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.layout_download);
        notification.contentIntent = pendingIntent;
        notification.contentView.setImageViewResource(R.id.status_icon, R.drawable.icon_rom);
        notification.contentView.setTextViewText(R.id.download_description, "Downloading");
        notification.contentView.setProgressBar(R.id.download_progress, 100, 0, false);

        getApplicationContext();
        notificationManager = (NotificationManager) getApplicationContext().getSystemService(
                Context.NOTIFICATION_SERVICE);

        notificationManager.notify(43, notification);
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        //notification.contentView.setProgressBar(R.id.download_progress, 100, Math.round(progress[0]), false);
        notification.contentView.setTextViewText(R.id.download_description, Integer.toString(progress[0]));
        // inform the progress bar of updates in progress
        notificationManager.notify(43, notification);
    }

    @Override
    protected void onPostExecute(String result) {
        notification.contentView.setProgressBar(R.id.download_progress, 100, 100, false);
        notification.contentView.setTextViewText(R.id.download_description, "Done");
        notificationManager.notify(43, notification);
    }

我真的被困在这一个 - 任何帮助将不胜感激。干杯

    @Override
    protected void onProgressUpdate(Integer... progress) {
        if ((progress[0] - lastSize) > 5000) {
            lastSize = progress[0];
            notification.contentView.setProgressBar(R.id.download_progress, totalSize, progress[0], false);
            //notification.contentView.setTextViewText(R.id.download_description, Integer.toString(progress[0]));
            // inform the progress bar of updates in progress
            notificationManager.notify(43, notification);
        }
    }

1 个答案:

答案 0 :(得分:7)

使用mod运算符仅更新5%,10%或20%。您在下载过程中不断调用onPressressUpdate()。

if (downloadedSize % (totalSize / 20) == 0) { // 20 updates every 5%, 10 every 10% and 5 every 20%, etc.
    publishProgress((downloadedSize / totalSize) * 100);
}