AsyncTask#2 java.lang.RuntimeException 公共静态位图getBitmapFromURL(字符串src){ 试一试{ URL=新URL(src); HttpURLConnection connection=(HttpURLConnection)url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream输入=连接。getInputStream(); 位图myBitmap=BitmapFactory.decodeStream(输入); 返回我的位图; }捕获(IOE异常){ e、 printStackTrace(); 返回null; } } 私有类AsyncImageLoader扩展了AsyncTask{ 位图[]; 受保护的void onPreExecute(){ setMessage(getContext().getResources().getString(R.string.please_wait)); showDialog(); } @凌驾 受保护位图[]doInBackground(字符串…参数){ hideDialog(); 位图=新位图[2]; 位图[0]=getBitmapFromURL(参数[0]); 位图[1]=getBitmapFromURL(参数[1]); 返回位图; } @凌驾 受保护的void onPostExecute(位图[]bm){ setImageBitmap(bm[1]); bm[1].recycle(); imgProfile.setImageBitmap(bm[0]); bm[0].recycle(); if(MainActivity.PROFILE\u UID.equals(MainActivity.USER\u UID)) FragmentDrawer.imgProfileNavDrawer.setImageBitmap(bm[0])//Sol-drawer'daıkan yuvarlak resmi güncellemek için } }

AsyncTask#2 java.lang.RuntimeException 公共静态位图getBitmapFromURL(字符串src){ 试一试{ URL=新URL(src); HttpURLConnection connection=(HttpURLConnection)url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream输入=连接。getInputStream(); 位图myBitmap=BitmapFactory.decodeStream(输入); 返回我的位图; }捕获(IOE异常){ e、 printStackTrace(); 返回null; } } 私有类AsyncImageLoader扩展了AsyncTask{ 位图[]; 受保护的void onPreExecute(){ setMessage(getContext().getResources().getString(R.string.please_wait)); showDialog(); } @凌驾 受保护位图[]doInBackground(字符串…参数){ hideDialog(); 位图=新位图[2]; 位图[0]=getBitmapFromURL(参数[0]); 位图[1]=getBitmapFromURL(参数[1]); 返回位图; } @凌驾 受保护的void onPostExecute(位图[]bm){ setImageBitmap(bm[1]); bm[1].recycle(); imgProfile.setImageBitmap(bm[0]); bm[0].recycle(); if(MainActivity.PROFILE\u UID.equals(MainActivity.USER\u UID)) FragmentDrawer.imgProfileNavDrawer.setImageBitmap(bm[0])//Sol-drawer'daıkan yuvarlak resmi güncellemek için } },java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,01-10 21:11:14.621 7906-8194/project.com.holobech E/AndroidRuntime﹕ 致命异常:异步任务#2 java.lang.RuntimeException:执行doInBackground()时出错 在android.os.AsyncTask$3.done(AsyncTask.java:299) 位于java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)

01-10 21:11:14.621 7906-8194/project.com.holobech E/AndroidRuntime﹕ 致命异常:异步任务#2 java.lang.RuntimeException:执行doInBackground()时出错 在android.os.AsyncTask$3.done(AsyncTask.java:299) 位于java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 位于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) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 运行(Thread.java:856) 原因:java.lang.OutOfMemoryError 在android.graphics.BitmapFactory.NativeDecodeseam(本机方法) 位于android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:528) 位于android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:600) 位于project.com.holobech.activity.ProfileFragment.getBitmapFromURL(ProfileFragment.java:508) 位于project.com.holobech.activity.ProfileFragment$AsyncImageLoader.doInBackground(ProfileFragment.java:529) 位于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) 运行(Thread.java:856)

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

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

处理android位图的最佳实践可以在开发者网站上找到。你可以点击


注意:-largeHeap功能只能在操作系统3.0及以上级别运行。

在该日志中看起来像是内存不足错误,这可以解释为什么在不同的设备/Android API上会得到不同的结果。我处理内存错误,但第一个错误仍然发生
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
        }
    }