java - 应用程序进入黑屏,然后在线程结束后重新启动
问题描述
好的,所以我基本上是在制作一个原生 Android '更新'应用程序(使用 Java)。该应用程序所做的是在单击按钮后从 Internet 下载一些文件。
当点击“下载”按钮时,函数 downloadMaps() 被执行:
private void downloadMaps() {
final DownloadManager downloadmanager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse("http://android.nsnav.com/update/maps.zip");
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setTitle("Maps");
final long downloadId = downloadmanager.enqueue(request);
final ProgressBar mProgressBar = (ProgressBar) findViewById(R.id.progressBar2);
mProgressBar.setVisibility(VISIBLE);
bUpdateMaps.setVisibility(View.INVISIBLE);
prompt.setText("Downloading Maps Update");
new Thread(new Runnable() {
TextView percentage = (TextView)findViewById(R.id.percentage);
@Override
public void run() {
boolean downloading = true;
while (downloading) {
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(downloadId);
Cursor cursor = downloadmanager.query(q);
cursor.moveToFirst();
int bytes_downloaded = cursor.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
downloading = false;
//registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
final int dl_progress = (int) ((bytes_downloaded * 100l) / bytes_total);
runOnUiThread(new Runnable() {
@Override
public void run() {
mProgressBar.setProgress((int) dl_progress);
percentage.setText(Integer.toString(dl_progress) + "%");
//doTask();
if (dl_progress==100){
prompt.setText("Installing Maps Update");
}
}
});
cursor.close();
}
}
}).start();
registerReceiver(onComplete, new IntentFilter(downloadmanager.ACTION_DOWNLOAD_COMPLETE));
}
BroadcastReceiver onComplete=new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent) {
if (mapsZip){
unzipFolderMaps();
deleteMaps();
}
prompt.setText("Maps Download Completed!");
bUpdateMaps.setVisibility(View.INVISIBLE);
}
};
如您所见,我还在函数中添加了一个线程,用于更新应用程序布局中存在的循环进度条。
问题是当下载完成时,应用程序关闭然后再次重新启动。而且最后的Broadcast Receiver的代码没有执行!下载完成后如何阻止应用程序崩溃,而是成功地执行广播接收器的代码?
解决方案
推荐阅读
- cordova - IONIC 4 无法安装 cordova-plugin-connectsdk
- javascript - 我对反应中的 const 关键字感到困惑
- java - 替换 JAVA 中 HTML 文件的占位符
- reactjs - 无法执行搜索
- node.js - 在 Express 中处理重定向以支持 nginx 反向代理
- python - 使用 cmd 或 powershell 安装 Python
- ios - iOS 应用可以调用用户创建的快捷方式吗?
- javascript - 谷歌地图授权。钥匙 - 放在哪里?
- c# - 如何在 Azure 上查看应用程序日志记录
- jquery - jQuery-机票价格计算