AsyncTask#2 java.lang.RuntimeException

时间:2016-01-10 21:14:01

标签: java android multithreading android-asynctask

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:FATAL EXCEPTION:AsyncTask#2       java.lang.RuntimeException:执行doInBackground()时发生错误               在android.os.AsyncTask $ 3.done(AsyncTask.java:299)               at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)               at java.util.concurrent.FutureTask.setException(FutureTask.java:219)               在java.util.concurrent.FutureTask.run(FutureTask.java:239)               在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)               at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:573)               在java.lang.Thread.run(Thread.java:856)        引起:java.lang.OutOfMemoryError               在android.graphics.BitmapFactory.nativeDecodeStream(本机方法)               在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:528)               在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:600)               at project.com.holobech.activity.ProfileFragment.getBitmapFromURL(ProfileFragment.java:508)               at project.com.holobech.activity.ProfileFragment $ AsyncImageLoader.doInBackground(ProfileFragment.java:529)               at 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)   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)   at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:573)   在java.lang.Thread.run(Thread.java:856)

适用于Android 5.0及更高版本。但是当我尝试使用4.2.2版本时,会出现该错误。我该如何解决这个问题? 谢谢你的建议

1 个答案:

答案 0 :(得分:2)

一旦处理了位图,这是非常常见的错误。直接从URL转换位图不是一个好习惯。您应该使用android提供的位图BitmapFactory.Options功能,通过该功能,您甚至无需创建位图即可获得位图的大小。现在,您必须使用BitmapFactory选项的insamplesize并重新调整图像大小。我猜图像的大小和质量太高了,这就是为什么当你将它转换成位图时它会让你内存不足。每个Android应用程序都有超过50 MB的RAM使用,一旦超过该限制android系统抛出内存异常。但是,我们可以通过在应用程序标记largeHeap中将清单中的属性条目设置为true来管理它。

开发者网站上提供了处理android位图的最佳做法。您可以点击here

注意: - largeHeap功能仅适用于操作系统级别3.0及以上版本。