【发布时间】:2016-10-10 02:33:57
【问题描述】:
在我的 Post 类中,在 saveBitmap 方法中,我使用界面中的方法转到 URL 并将图像检索到位图中,然后将其返回。它工作正常,它确实检索位图,但如果我尝试在接口方法之外使用 bitmap[0](如图 1 所示),它会说它为空。
因此,每当我必须处理检索到的值时,它必须在方法内部,并且由于某种原因它不会让我将其取出。随之而来的另一个问题(我认为可能会被捆绑)是我需要重写 onDownloadComplete 方法两次。在我的 Post 类的最底部,您可以看到它再次被空主体覆盖。我有这个,所以我实现 onDownloadImageListener 的 Post 类的最上面一行没有红线。
我不知道如何解决这个问题,我希望能够检索侦听器方法之外的值。
帖子类:
public class Post extends Fragment implements OnDownloadImageListener {
...
private void saveBitmap(String userName, String key){
DownloadImage downloadImage = new DownloadImage();
final Bitmap[] bitmap = new Bitmap[1];
final String url = "https://graph.facebook.com/" + key + "/picture?type=large";
downloadImage.execute(url);
downloadImage.setOnDownloadImageListener(new OnDownloadImageListener() {
@Override
public void onDownloadComplete(Bitmap bmap) {
bitmap[0] = bmap;
}
});
//**FIGURE 1**
}
@Override
public void onDownloadComplete(Bitmap bmap) { //I need this otherwise it gives me an error on the top line where I have "implements OnDownloadImageListener"
下载图片类:
public class DownloadImage extends AsyncTask<String, Void, Bitmap> {
private OnDownloadImageListener listener;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Bitmap doInBackground(String... URL) {
String imageURL = URL[0];
Bitmap bitmap = null;
try {
// Download Image from URL
InputStream input = new java.net.URL(imageURL).openStream();
// Decode Bitmap
bitmap = BitmapFactory.decodeStream(input);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
if(listener!=null){
listener.onDownloadComplete(result);
}
}
public void setOnDownloadImageListener(OnDownloadImageListener listener){
this.listener=listener;
}
}
最后,我的界面/听众:
public interface OnDownloadImageListener {
void onDownloadComplete(Bitmap bmap);
}
【问题讨论】:
-
使用
downloadImage.setOnDownloadImageListener(this)并处理Bitmap传入onDownloadComplete(Bitmap bmap)方法“在我的Post 类的最底部”。 -
@Onik 谢谢,这解决了我使用两种相同方法的部分问题。但是如果我使用全局变量设置为从 onDownloadComplete 检索的值,它仍然会由于某种原因返回 null,除非它在 onDownloadComplete 内部使用。有什么特别的解决方案吗?
-
“由于某种原因它仍然返回 null,除非它在 onDownloadComplete 内部使用。有什么特殊的解决方案吗?” 当然不是!在您的情况下,获取网络响应是一个异步操作。在操作完成之前,
Bitmap的值将保持不变。直到那时Bitmap等于它的初始值(所以如果它是null它就是null)。这就是您使用接口的原因 - 通知Post类Bitmap的值已更改。 -
我推荐为此任务使用框架,例如Glide
-
@Onik 啊,对,我差点忘了我正在使用异步任务,所以这会让我很痛苦。再次感谢您的帮助。