我的应用程序可以选择下载文件。它以这种方式工作: 活动 - > IntentService - > AsyncTask(此处文件正在下载)。另外,我使用通知来显示百分比的进度,这是我的问题:一切运作良好,例如在Android 2.3上,但在Android 4.2或5.0上,UI被阻止。
之前我的代码中有一个错误(我每次都在循环中更新了进度条),现在当我只在oldProgress!= actualProgress时更新它时,它运行良好(100+操作而不是2000+)。但是为什么它在Android 2.3上运行良好,即使有2000多个操作呢?
这是我的通知类:
public class NotificationProgressHelper {
private static final int DOWNLOAD_PROGRESS_NOTIFICATION_ID = 1;
private Context mContext;
private Notification mNotification;
private NotificationManager mNotificationManager;
private PendingIntent mContentIntent;
private CharSequence mContentTitle;
public NotificationProgressHelper(Context context) {
mContext = context;
}
public void createNotification() {
mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
int icon = R.drawable.download_icon;
CharSequence contentName = mContext.getString(R.string.notification_content_name);
mNotification = new Notification(icon, contentName, System.currentTimeMillis());
mContentTitle = mContext.getString(R.string.notification_title);
CharSequence contentText = mContext.getString(R.string.notification_percent_completed, 0);
//pending intent left blank till the whole apk file will be downloaded
Intent notificationIntent = new Intent();
mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, 0);
mNotification.setLatestEventInfo(mContext, mContentTitle, contentText, mContentIntent);
mNotification.flags = Notification.FLAG_ONGOING_EVENT;
mNotificationManager.notify(DOWNLOAD_PROGRESS_NOTIFICATION_ID, mNotification);
}
public void progressUpdate(int percentageComplete) {
CharSequence contentText = mContext.getString(R.string.notification_percent_completed, percentageComplete);
mNotification.setLatestEventInfo(mContext, mContentTitle, contentText, mContentIntent);
mNotificationManager.notify(DOWNLOAD_PROGRESS_NOTIFICATION_ID, mNotification);
}
public void completed() {
mNotificationManager.cancel(DOWNLOAD_PROGRESS_NOTIFICATION_ID);
}
public void removeDownloadSuccessNotification() {
mNotificationManager.cancel(ApplicationConstants.NotificationID.APP_UPDATE_NOTIFICATION_ID);
}
当然,在doInBackground()中调用downloadFile方法。
我知道这段代码已经过时了,现在我应该使用构建器,但是我尝试了它并没有涉及到这个问题。
我做错了吗?为什么具有所有操作的版本在Android 2.3上运行良好?我认为它适用于主线程,但为什么?
答案 0 :(得分:0)
在甜甜圈和直到Honeycomb(1.6 - 3.0)之后直到3.0版 默认情况下它并行使用多个AsyncTask,这可能就是它工作正常的原因。 可以参考https://stackoverflow.com/a/36078608/2249287
来详细解释相同的问题