gpt4 book ai didi

android - 广播接收器 IntentReceiverLeaked

转载 作者:行者123 更新时间:2023-11-29 18:50:02 24 4
gpt4 key购买 nike

我正在尝试下载一个文件,下载后想在数据库中更新它,但我的 Intent 是服务广播接收器造成了这个问题:

android.app.IntentReceiverLeaked: Service com.dev.newtermain.services.intent_service.DownloadService has leaked IntentReceiver com.dev.newtermain.services.intent_service.DownloadService$DownloadCompleteReceiver@d4fdde9 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:969)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:731)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1179)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1159)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1153)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:554)
at com.dev.newtermain.services.intent_service.DownloadService.onStartCommand(DownloadService.java:70)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3228)
at android.app.ActivityThread.-wrap17(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1591)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5769)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

这是我的 Intent 服务代码:

public class DownloadService extends IntentService {
public DownloadService() {
super("Download Service");
}

Long downloadId;
private DownloadManager downloadManager;

@Override public void onCreate() {
super.onCreate();
downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
completeReceiver = new DownloadCompleteReceiver();
}

@Override public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onHandleIntent(intent);
this.intent = intent;
return START_STICKY;
}

@Override
protected void onHandleIntent(Intent intent) {

String key = intent.getStringExtra(DOWNLOAD_KEY);
messageId = intent.getStringExtra(MESSAGE_ID);
mReactionId = intent.getStringExtra(REACTION_ID);
int messageType = intent.getIntExtra(MESSAGE_TYPE, 3);
initDownload(key, messageType);
}

private void initDownload(String key, int messageType) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.addRequestHeader("Authorization", SharedPref.User.getToken());

// In order for this if to run, you must use the Android 3.2 to
// compile your app
request.allowScanningByMediaScanner();
request.setAllowedOverMetered(true);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(path, fileName);

// Get download service and enqueue file
downloadId = downloadManager.enqueue(request);

Logs.e("file download", "downloading begin");
IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
this.registerReceiver(completeReceiver, intentFilter);
}

public class DownloadCompleteReceiver extends BroadcastReceiver {
public DownloadCompleteReceiver() {
}

@Override public void onReceive(Context context, Intent intent) {
Logs.e("file download", "broadcast received");
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
Cursor cursor = downloadManager.query(query);
if (cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
int status = cursor.getInt(columnIndex);
cursor.close();

switch (status) {
case DownloadManager.STATUS_SUCCESSFUL:
Logs.e("file download", "download successful");
updateDb(fileName, messageId, Id);
break;
case DownloadManager.STATUS_FAILED:
Logs.e("file download", "download Fail");
break;
case DownloadManager.STATUS_PENDING:
Logs.e("file download", "STATUS_PENDING");
break;
case DownloadManager.STATUS_RUNNING:
Logs.e("file download", "STATUS_RUNNING");
break;
}
}
}
}

@Override public void onDestroy() {
Logs.e("file download", "stopping service");
this.unregisterReceiver(completeReceiver);
downloadManager.remove(downloadId);
super.onDestroy();
}

正如广播接收器的文档所建议的那样,我正在注销广播接收器,但我不明白为什么会出现此问题。

编辑

我应用了所有建议的答案,新的问题是如果我添加一个广播接收器它会给出成功响应但不保存文件但是当我删除广播接收器文件下载成功

最佳答案

只需通过更改广播取消注册功能的位置来替换您的代码

@Override public void onDestroy() {
downloadManager.remove(downloadId);
this.unregisterReceiver(completeReceiver);
super.onDestroy();
}

关于android - 广播接收器 IntentReceiverLeaked,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51093326/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com