Как дождаться ненулевого возврата перед продолжением - PullRequest
0 голосов
/ 06 мая 2020

Я хочу получить растровое изображение из отдельного класса. В отдельном классе есть метод, который загружает растровое изображение с онлайн-сервера с помощью обратного вызова данных. По умолчанию метод возвращает значение null, пока не будет загружено растровое изображение. Когда я вызываю метод из своего основного класса, я получаю null. Как я могу дождаться, пока это извлечение не будет равно нулю (то есть растровое изображение было загружено), прежде чем продолжить какие-либо операции с основным классом?

Основной класс

profileBitmap = myParse.getImageBitmap(getContext(), tagId);

Отдельный класс

public Bitmap getImageBitmap (final Context context, String tagId) {

        // give us the user's photo
        ParseQuery<ParseObject> parseQuery = new ParseQuery<>("Photo");
        parseQuery.whereEqualTo("username", tagId);
        parseQuery.getFirstInBackground(new GetCallback<ParseObject>() {
            @Override
            public void done(ParseObject object, ParseException e) {
                if (object != null && e == null) {
                    ParseFile profilePic = (ParseFile) object.get("profilePicture");
                    //download process
                    profilePic.getDataInBackground(new GetDataCallback() {
                        @Override
                        public void done(byte[] data, ParseException e) {
                            if (data != null && e == null) {
                                // converts file to image
                                selectedImageBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                            } else {
                                // returns error user bitmap
                                selectedImageBitmap = BitmapFactory.decodeResource(context.getResources(), android.R.drawable.ic_dialog_alert);
                                FancyToast.makeText(context, "Error: " + e.getMessage(), FancyToast.LENGTH_SHORT, FancyToast.ERROR, false).show();
                            }
                        }
                    });
                } else {
                    // returns empty user bitmap
                    selectedImageBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.empty_user);
                    FancyToast.makeText(context, "Error: " + e.getMessage(), FancyToast.LENGTH_SHORT, FancyToast.ERROR, false).show();
                }
            }
        });
        return selectedImageBitmap;
    } 

1 Ответ

1 голос
/ 07 мая 2020

Я бы использовал listener:

Создайте interface в новом файле:

public interface onBitmapDownloadedListener{

void onDownloadFinished(Bitmap bitmap);

}

В вашем основном классе. interface и передайте ссылку на ваш основной класс классу MyParse

class MainClass implements onBitmapDownloadedListener{


//now when you create an instance of myParse, pass the listener
......

myParse = new MyParse(this);

@Override
public void onDownloadFinished(Bitmap bitmap){

//here you get the bitmap

profileBitmap = bitmap

}

Создайте конструктор в классе MyParse, который принимает интерфейс:

class MyParse {

private onBitmapDownloadedListener listener;


//constrcutor
public MyParse(onBitmapDownloadedListener listener){

this.listener = listener

}

//your method
public Bitmap getImageBitmap (final Context context, String tagId) {
........
........
........

@Override
public void done(byte[] data, ParseException e) {
if (data != null && e == null) {
// converts file to image
selectedImageBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

//notify here
listener.onDownloadFinished(selectedImageBitmap);

}
....
....
....


}


}
...