android - 我必须修复一个 bug nullpointerexception

标签 android android-asynctask nullpointerexception wallpaper

我有一个错误只出现在 froyo 设备上

Bitmap.createScaledBitmap() 中的空指针异常

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.NullPointerException
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:344)
at com.varxstudio.beautifulwallpapersLite.Imagen.a(Unknown Source)
at com.varxstudio.beautifulwallpapersLite.g.a(Unknown Source)
at com.varxstudio.beautifulwallpapersLite.g.doInBackground(Unknown Source)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)

这里是任何解决方案的代码??为什么只在froyo??? 以前只使用 BitmapFactory.decodeStream(inputStream) 加载图像,但我找到了一个 flusedInputStream 方法来执行此操作,但我仍然遇到相同的错误

private class DownloadDialog extends AsyncTask<Void, Void, Void> {

    ProgressDialog myDialog = null;
    int result = 0;

    @Override
    protected void onPreExecute() {
        myDialog = ProgressDialog.show(Imagen.this, "", advert);
        myDialog.setCancelable(true);
        return;
    }

    @Override
    protected Void doInBackground(Void... params) {
        result = setWallpaper(path);

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        myDialog.dismiss();
        switch (result){
            ----
        }
        return;
    }
}

public int setWallpaper(String path) {          
    int width, height;
    Bitmap dbm, bm;         
    bm = null;
    dbm = null; 
    InputStream is = null;

    WallpaperManager wpm = WallpaperManager.getInstance(this);
    dis = getWindowManager().getDefaultDisplay();           

    if((wpm != null) && (dis != null)){ 
        height = dis.getHeight();
        width = (int) (height * 1.33);              

        try {           
            URLConnection conn = new URL(path).openConnection();                
            conn.connect();             
            is = conn.getInputStream();             

            if (is != null) {                   
                bm = BitmapFactory.decodeStream(new FlushedInputStream(is));                    
                dbm = Bitmap.createScaledBitmap(bm, width, height, false);
                wpm.setBitmap(dbm);                 
            }else {
                return 2;
            }

        } catch (MalformedURLException e) {                 
            e.printStackTrace();                
        } catch (IOException e) {               
            e.printStackTrace();                
        } finally {             
            if (is != null) {
                try {
                    is.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }           
        if(bm != null){
            bm.recycle();
        }
        if(dbm != null){
            dbm.recycle();  
        }           
    }else {
        return 1;
    }
    return 0;
}

static class FlushedInputStream extends FilterInputStream {
    public FlushedInputStream(InputStream inputStream) {
        super(inputStream);
    }

    @Override
    public long skip(long n) throws IOException {
        long totalBytesSkipped = 0L;
        while (totalBytesSkipped < n) {
            long bytesSkipped = in.skip(n - totalBytesSkipped);
            if (bytesSkipped == 0L) {
                int b = read();
                if (b < 0) {
                    break;  // we reached EOF
                } else {
                    bytesSkipped = 1; // we read one byte
                }
            }
            totalBytesSkipped += bytesSkipped;
        }
        return totalBytesSkipped;
    }
}

最佳答案

你有 NullPointerException 因为 BitmapFactory.decodeStream(new FlushedInputStream(is)); 返回 null,BitmapFactory.decodeStream(stream) 返回 null 的原因是图像不好。 Bad Image 在某种意义上确保您返回的是 Android 支持的位图格式(示例 Android 不支持 tiff)。第二个原因是因为图像分辨率,如果图像分辨率太高解码失败..所以确保你有小图像。

这是我在 SO 中发布的关于相同问题的问题.. Bitmap failed to create using BitmapFactory.decodeArray

我之前遇到过同样的问题,但我通过使用 Android 开发者网站提供的教程克服了它 Displaying Bitmaps Efficiently

关于android - 我必须修复一个 bug nullpointerexception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14900667/

相关文章:

android - 如何使用singleWhere .. flutter访问列表内的项目

android - ShadowAlertDialog.getLatestAlertDialog() 为 android.support.v7.app.AlertDialog 返回 null

java - AsyncTask 不会改变其他变量的值

android - Activity ——共享数据(单例数据类)

java - Servlet 的 NullPointerException

android - Network Changed Broadcast Receiver 在一加手机中不执行

android - SurfaceView 的缩放动画

android - 从自定义适配器类调用的 AsyncTask 更新 ListView

java - Android AsyncTask 媒体播放器通信

java - 什么是NullPointerException,我该如何解决?