我正在尝试使用此AsyncTask
protected Bitmap doInBackground(String... params) {
String urldisplay = params[0];
if(params[1] != null)
newClan = params[1];
if(params[2] != null){
Context ctx = Home.getContext();
prevClan = params[2];
File f = new File(ctx.getFilesDir(), prevClan + ".png");
if(f.exists()){
File d = f.getAbsoluteFile();
d.delete();
}
}
Bitmap emblem = null;
try {
//get emblem from url
InputStream in = new java.net.URL(urldisplay).openStream();
emblem = BitmapFactory.decodeStream(in);
} catch (MalformedURLException e) {
Log.e(e.getClass().toString(), e.getMessage());
} catch (IOException e) {
Log.e(e.getClass().toString(), e.getMessage());
}
return emblem;
}
public static void saveImage(Bitmap img){
Context ctx = Home.getContext();
try {
FileOutputStream out = new FileOutputStream(ctx.getFilesDir().getPath() + File.separatorChar + newClan + ".png");
img.compress(Bitmap.CompressFormat.PNG, 100, out);
} catch (FileNotFoundException e) {
} catch (NullPointerException e1) {
Log.e("NullPointerException DownloadImageTask", e1.toString());//TODO
}
}
这就像这样调用
File emblemPath = new File(ctx.getFilesDir(), clan + ".png");
Log.e("image size", emblemPath.length()+"");//TODO
if(emblemPath.exists()){
emb.setImageDrawable(Drawable.createFromPath(emblemPath.toString()));
Log.e("Image exists", "size = " + emblemPath.length());//TODO
}
else{
String prevClan = pref.getString("prevClan", null);
emb.setImageBitmap(Storage.updateClanEmb(embURL, clan, prevClan));
Log.e("Image downloaded", "size = " + emblemPath.length());//TODO
}
我之前有一个登录屏幕,它提供了所需的变量。下载的图像在ImageView
中正确显示,但文件大小第一次为0,在注销然后重新登录后,它显示正确的文件大小。日志在这里:
- 05-25 04:52:32.973: E/result(22501): {"login":0,"clan":"Cosa Nostra","status":"0"}
- 05-25 04:52:32.984: E/Login success!(22501): Login success!
- 05-25 04:52:34.554: E/image size(22501): 0
- 05-25 04:52:35.953: E/Image downloaded(22501): size = 0
- 05-25 04:52:44.553: E/Logout(22501): Logged out
- 05-25 04:52:54.893: E/result(22501): {"login":0,"clan":"Cosa Nostra","status":"0"}
- 05-25 04:52:54.893: E/Login success!(22501): Login success!
- 05-25 04:52:57.034: E/image size(22501): 2461
- 05-25 04:52:57.094: E/Image exists(22501): size = 2461
保存图像后,为什么文件大小不正确?我错了吗?作为旁注,我是Android的新手,并没有完全掌握如何使用上下文。我担心这可能是我的问题。在代码中,Home是从中调用它的活动。
修改
我在@ Samarth的请求中将此行添加到onPostExecute()
iv.setImageBitmap(result);
其中iv
是显示下载图像的ImageView
。结果日志完全相同。有人可以解释在AsyncTask's onPostExecute()
方法中设置图像的优势吗?我似乎忘记了我的updateClanEmblem
方法,所以这里是:
/**
* Method to call DownloadImageTask which downloads then saves the updated clan emblem
*
* @param iv The ImageView to set the emblem to
* @param url The URL, as a String, to the page containing ONLY the clan emblem.
* @param newClan The new clan emblem to download.
* @param prevClan The old clan emblem to delete. Can be null.
*/
public static void updateClanEmb(ImageView iv, String url, String newClan, String prevClan){
String[] params = {
url,
newClan,
prevClan,
};
try {
new DownloadImageTask(iv).execute(params).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
答案 0 :(得分:0)
您应该在AsyncTask的onPostExecute方法中进行图像保存和分配。我认为您正在尝试在下载图像之前设置图像。
你什么时候打电话给那段代码。你什么时候调用saveImage?
答案 1 :(得分:0)
经过一番努力,我找到了解决办法。在我尝试检查文件大小之前,AsyncTask
尚未完成。我的印象是.get()
方法会让它等到它完成,但我错了。我没有及早发现这个问题的原因是我犯了一个错误并且正在检查AsyncTask
中的错误文件,因此获得了误导性信息。
我从中学到了什么:.get()
的{{1}}方法并不总是等待任务完成。做任何需要在AsyncTask
方法中完成的事情,否则它将无法按预期工作。我仍然不确定onPostExecute()
方法的作用。