我有一个只出现在froyo设备中的错误
Bitmap.createScaledBitmap()
中的nullpointerexceptionjava.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;
}
}
答案 0 :(得分:4)
你有NullPointerException因为
BitmapFactory.decodeStream(new FlushedInputStream(is));
返回null,BitmapFactory.decodeStream(stream)
返回null的原因是图像错误。
错误的图像在某种意义上确保您返回Android支持的位图格式(示例Android doesn't support tiff
)。第二个原因是因为图像分辨率,如果图像分辨率太高,解码失败,那么请确保你的图像很小。
这是我在SO中发布的有关相同问题的问题。Bitmap failed to create using BitmapFactory.decodeArray
我之前遇到过同样的问题但是我已经使用Android开发者网站Displaying Bitmaps Efficiently提供的教程来解决它了