2016-10-10 12 views
0

私のポストクラスでは、saveBitmapメソッド内で、私のインターフェイスのメソッドを使用してURLに行き、イメージをビットマップに取得して返します。それはうまく動作し、ビットマップを取得しますが、インターフェイスメソッド(図1)の外でビットマップ[0]を使用しようとすると、nullと表示されます。オーバーライドされたメソッド以外の値を使用するとnullになる

したがって、取得した値を処理する必要があるときは、メソッド内にある必要があり、何らかの理由でそれを取り出せません。これに続く他の問題(結びつく可能性がある)は、onDownloadCompleteメソッドを2回オーバーライドする必要があるということです。私のポストクラスの一番下に、空のボディで再びオーバーライドされていることがわかります。私はonDownloadImageListenerを実装している私のPostクラスの一番上の行が赤線にならないようにしています。

これを修正する方法がわかりません。リスナーメソッド以外の値を取得できるようにしたいと考えています。

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" 

DownloadImageクラス:

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); 
} 
+0

使用 'downloadImage.setOnDownloadImageListener(本)'と 'Bitmap'は_ "私Postクラスの一番下に"' onDownloadComplete(ビットマップBMAP) 'メソッド_に渡さ処理します。 – Onik

+0

@Onikありがとう、それは同じ方法の2つを使うという私の問題の一部を解決しました。しかし、グローバル変数を使用してonDownloadCompleteから取得する値として設定すると、onDownloadCompleteの内部で使用されていない限り何らかの理由でnullが返されます。このための特定のソリューションですか? – SaltySea

+0

_ "これは、onDownloadCompleteの内部で使用されていない限り何らかの理由でnullを返します。これに対する特定の解決策はありますか?"あなたのケースでネットワーク応答を取得することは、非同期操作です。 'Bitmap'の値は操作が完了するまで変更されません。これまでの 'Bitmap'は初期値と等しくなります(' null'ならば 'null'です)。だから、あなたは 'Post'クラスに' Bitmap'の値が変更されたことを知らせるためにインターフェースを使用します。 – Onik

答えて

1

DownloadImageオブジェクトdownloadImageのsetOnDownloadImageListenerメソッドにこれを渡します(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(this); 
    //**FIGURE 1** 
} 

@Override 
public void onDownloadComplete(Bitmap bmap) { 
    bitmap[0] = bmap; //fixed the variable error 
} 
関連する問題