2016-10-10 3 views
0

내 Post 클래스에서 saveBitmap 메서드 내에서 내 인터페이스의 메서드를 사용하여 URL로 이동하여 이미지를 비트 맵으로 가져 와서 반환합니다. 잘 작동하지만 비트 맵을 검색하지만 인터페이스 메소드 (그림 1) 밖에서 비트 맵 [0]을 사용하려고하면 null입니다.재정의 된 메서드 외부의 값을 사용하면 null이됩니다.

그래서 검색된 값에 대해 작업해야 할 때마다 메서드 내부에 있어야하며 어떤 이유로 든 내 값을 빼낼 수 없습니다. 이 문제를 해결할 수있는 다른 문제는 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" 

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'가 _ "내 포스트 클래스의 맨 아래에"는'onDownloadComplete (비트 맵 bmap)'방법 _ 전달 처리합니다. – Onik

+0

@Onik 두 가지 동일한 방법을 사용하여 내 문제의 일부를 해결해 주셔서 감사합니다. 하지만 전역 변수를 사용하여 onDownloadComplete에서 검색되는 값으로 설정하면 onDownloadComplete 내부에서 사용되지 않는 한 어떤 이유로 든 null을 반환합니다. 이것에 대한 어떤 특별한 해결책? – SaltySea

+0

_ "여전히 onDownloadComplete 내부에서 사용되지 않는 한 어떤 이유로 든 null을 반환합니다. 어떤 특정 솔루션이 필요합니까?"_ 물론 아닙니다! 귀하의 경우 네트워크 응답을 얻는 것은 비동기 작업입니다. 비트 맵의 ​​값은 작업이 완료 될 때까지 변경되지 않습니다. 그때까지'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 
} 
관련 문제