按下返回按钮时,Android runOnUiThread崩溃

Joz*_*eRi 5 android asynchronous nullpointerexception android-ui android-adapter

我正在使用DownloadManager从服务器下载文件,正在从适配器下载文件,并且正在使用runOnUiThread在片段中显示下载进度。它工作得很好,但是当我在下载时按返回按钮时,runOnUiThread会引发NullPointerException。我尝试使用if语句将变量放在onPause中以停止该方法,但它也不起作用。

您建议如何解决此崩溃问题?

这是我的代码:

new Thread(new Runnable() {
                        @Override
                        public void run() {

                            downloading = true;

                            while (downloading) {

                                DownloadManager.Query q = new DownloadManager.Query();
                                q.setFilterById(myDownloadReference);

                                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;
                                    downloadingDocs.remove(doc);

                                    //remove the progressBar when download is complete
                                    fragment.getActivity().runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                            finalHolder2.downloadProgress.setVisibility(View.INVISIBLE);
                                        }
                                    });

                                    //check if it's the last download and open it.
                                    if (downloadingDocs.size() == 0) {
                                        actionIntentOpenDocs(doc, saveFile);
                                    }
                                }
                                //final double dl_progress = (bytes_downloaded / bytes_total) * 100;
                                final int dl_progress = (int) ((bytes_downloaded * 100l) / bytes_total);

                                //display the download progress
                                fragment.getActivity().runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        if(Constants.stopUiThreadWork == null) {
                                            finalHolder2.downloadProgress.setProgress((int) dl_progress);
                                        }
                                    }
                                });
                                cursor.close();
                            }
                        }
                    }).start();
Run Code Online (Sandbox Code Playgroud)

它在此行崩溃:

fragment.getActivity().runOnUiThread(new Runnable() {
Run Code Online (Sandbox Code Playgroud)

崩溃堆栈跟踪:

FATAL EXCEPTION: Thread-4807
Process: com.appus.app, PID: 6553
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.runOnUiThread(java.lang.Runnable)' on a null object reference
        at com.availo.app.UI.adapters.MainFragmentDocumentAdapter$1$1.run(MainFragmentDocumentAdapter.java:265)
        at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)

Pea*_*oto 1

管理此类事情的最佳方法是通过Service。原因是服务可以更好地管理后台线程,即使活动没有运行,而像 AsyncTask 这样的东西将在活动完成时停止工作。请访问此网站了解如何设置下载服务。