내 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);
}
사용'downloadImage.setOnDownloadImageListener (이)'와'Bitmap'가 _ "내 포스트 클래스의 맨 아래에"는'onDownloadComplete (비트 맵 bmap)'방법 _ 전달 처리합니다. – Onik
@Onik 두 가지 동일한 방법을 사용하여 내 문제의 일부를 해결해 주셔서 감사합니다. 하지만 전역 변수를 사용하여 onDownloadComplete에서 검색되는 값으로 설정하면 onDownloadComplete 내부에서 사용되지 않는 한 어떤 이유로 든 null을 반환합니다. 이것에 대한 어떤 특별한 해결책? – SaltySea
_ "여전히 onDownloadComplete 내부에서 사용되지 않는 한 어떤 이유로 든 null을 반환합니다. 어떤 특정 솔루션이 필요합니까?"_ 물론 아닙니다! 귀하의 경우 네트워크 응답을 얻는 것은 비동기 작업입니다. 비트 맵의 값은 작업이 완료 될 때까지 변경되지 않습니다. 그때까지'Bitmap'은 초기 값과 동일합니다 (그래서'null'이라면'null'입니다). 이것이 인터페이스를 사용하는 이유입니다.'Post' 클래스에'Bitmap'의 값이 변경되었음을 알리기 위해서입니다. – Onik