簡體   English   中英

AsyncTask#2 java.lang.RuntimeException

[英]AsyncTask #2 java.lang.RuntimeException

public static Bitmap getBitmapFromURL(String src) {
        try {
            URL url = new URL(src);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            return myBitmap;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    private class AsyncImageLoader extends AsyncTask<String, Void, Bitmap[]> {
        Bitmap bitmap[];

        protected void onPreExecute() {
            pDialog.setMessage(getContext().getResources().getString(R.string.please_wait));
            showDialog();
        }

        @Override
        protected Bitmap[] doInBackground(String... params) {
            hideDialog();
            bitmap = new Bitmap[2];
            bitmap[0] = getBitmapFromURL(params[0]);
            bitmap[1] = getBitmapFromURL(params[1]);

            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap[] bm) {
            imgCover.setImageBitmap(bm[1]);
            bm[1].recycle();
            imgProfile.setImageBitmap(bm[0]);
            bm[0].recycle();
            if (MainActivity.PROFILE_UID.equals(MainActivity.USER_UID))
                FragmentDrawer.imgProfileNavDrawer.setImageBitmap(bm[0]); // Sol drawer' da çıkan yuvarlak resmi güncellemek için
        }
    }

01-10 21:11:14.621 7906-8194 / project.com.holobech E / AndroidRuntime:致命異常:AsyncTask#2 java.lang.RuntimeException:在android.os.AsyncTask $ 3.done執行doInBackground()時發生錯誤(AsyncTask.java:299)在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)在java.util.concurrent.FutureTask.setException(FutureTask.java:219)在java.util.concurrent.FutureTask。在java.util.concurrent上運行(FutureTask.java:239)在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:573)在java.lang.Thread.run(Thread.java:856)由以下原因引起:java.lang.OutOfMemoryError在android.graphics.BitmapFactory.nativeDecodeStream(本機方法)。在project.com.holobech.activity.ProfileFragment處的android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:600)處的graphics.BitmapFactory.decodeStream(BitmapFactory.java:528)。 在project.com.holobech.activity.ProfileFragment $ AsyncImageLoader.doInBackground(ProfileFragment.java:529)處的getBitmapFromURL(ProfileFragment.java:508)在project.com.holobech.activity.ProfileFragment $ AsyncImageLoader.doInBackground(ProfileFragment.java:516)處在android.os.AsyncTask $ 2.call(AsyncTask.java:287)在java.util.concurrent.FutureTask.run(FutureTask.java:234)在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230 )的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)的java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:573)的java.lang.Thread.run(Thread.java: 856)

它非常適合Android 5.0和更高版本。 但是,當我嘗試使用4.2.2版本時,就會發生該錯誤。 我該如何解決這個問題? 謝謝建議

一旦處理位圖,這是非常常見的錯誤。 直接從URL轉換位圖不是一個好習慣。 您應該使用android提供的位圖BitmapFactory.Options功能,通過它即使不創建位圖也可以獲取位圖的大小。 現在,您必須使用BitmapFactory選項的insamplesize並調整圖像大小。 我猜想圖像的大小和質量太高,這就是為什么當您將其轉換為位圖時會給您帶來內存不足的原因。 每個Android應用程序在超過該限制后將最多可使用50 mb RAM,而android系統拋出內存不足異常。 但是,我們可以通過將應用程序標簽中的清單中的屬性條目largeHeap設置為true來進行管理。

開發人員網站上提供了處理android位圖的最佳實踐。 你可以點擊這里

注意:-largeHeap功能僅適用於OS級別3.0及更高版本。

暫無
暫無

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

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