首页 > 解决方案 > 应用程序进入黑屏,然后在线程结束后重新启动

问题描述

好的,所以我基本上是在制作一个原生 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的代码没有执行!下载完成后如何阻止应用程序崩溃,而是成功地执行广播接收器的代码?

标签: javaandroidrunnableandroid-download-managerui-thread

解决方案


推荐阅读