【问题标题】:Using values outside of overridden method leads to null使用覆盖方法之外的值会导致 null
【发布时间】: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 啊,对,我差点忘了我正在使用异步任务,所以这会让我很痛苦。再次感谢您的帮助。

标签: java android interface


【解决方案1】:

你应该将this(指实现接口OnDownloadImageListener的Post类)传入DownloadImage对象downloadImage的setOnDownloadImageListener方法中。

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(this);
    //**FIGURE 1**
}

@Override
public void onDownloadComplete(Bitmap bmap) { 
    bitmap[0] = bmap; //fixed the variable error
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多