簡體   English   中英

按“返回”按鈕時Android runOnUiThread崩潰

[英]Android runOnUiThread crash when pressing Back button

我正在使用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();

它崩潰在這條線上:

fragment.getActivity().runOnUiThread(new Runnable() {

崩潰堆棧跟蹤:

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)

嘗試在執行runOnUiThread之前檢查您的活動 ,如下所示:

    /** check if activity still exist */
    if (getActivity() == null) {
        return;
    }

    getActivity().runOnUiThread(new Runnable() {
    ...
    });

“你不應該通過你的代碼散布回報?(...)”
“清潔”是它變得含糊不清的地方。 我們不是在編寫匯編程序,所以我不知道這是如何相關的。 蘋果和橘子。 編寫方法時,盡可能單一返回可提高可讀性和維護性。 如果您的代碼變得復雜或者需要遵循這種編碼風格需要多個return語句,那么該方法可能需要進一步分析和細分。 - giulio

@giulio - 參考,出版物,規格 - 我在你的評論中沒有看到 - 但我可以給你一些閱讀和獲得一些知識。

你可以從這里開始打擊你的想法:

然后閱讀我最喜歡的:

http://www.yegor256.com/2015/08/18/multiple-return-statements-in-oop.html

管理此類事情的最佳方式是通過服務 原因是服務可以更好地管理后台線程,即使活動沒有運行,而AsyncTask之類的東西將在活動完成后停止工作。 請查看此站點有關如何設置下載服務的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM