BlackBerry: создание класса изображений, пригодного для использования во всех случаях - PullRequest
1 голос
/ 31 декабря 2011

Я создал класс потока изображения, который запускает метод обновления в экземпляре, который загружает изображение:

public class ImageThread implements Runnable {
    private Bitmap image;
    private String url;
    private CustomEventField c;


    public ImageThread(String url, CustomEventField c){

        this.url = url;
        this.c = c;
    }

   public void notifyUs(){



        this.c.update(image);
    }

    public void run() {

        Bitmap img =  downloadImage.connectServerForImage(this.url); //data processing

        image = img;

        notifyUs();

    }




}

Я отправляю контекст в конструкторе, однако я могу использовать его только для CustomEventField.Что если я хочу использовать этот класс изображений для других классов?Я мог бы просто сделать еще одну копию этого класса, но я хочу, чтобы все было организовано.

Ответы [ 2 ]

2 голосов
/ 31 декабря 2011

Определите отдельный тип интерфейса, который все ваши классы могут затем реализовать по мере необходимости, например:

ImageThreadCallback.java:

public interface ImageThreadCallback
{
    void update(Bitmap image);
}

ImageThread.java:

public class ImageThread implements Runnable
{
    private Bitmap image;
    private String url;
    private ImageThreadCallback c;

    public ImageThread(String url, ImageThreadCallback c)
    {
        this.url = url;
        this.c = c;
    }

    public void notifyUs()
    {
        this.c.update(this.image);
    }

    public void run()
    {
        this.image = downloadImage.connectServerForImage(this.url); //data processing
        notifyUs();
    }
}

CustomEventField.java:

public class CustomEventField implements ImageThreadCallback
{
    public void update(Bitmap image)
    {
        ...
    }
}

CustomEntryField.java:

public class CustomEntryField implements ImageThreadCallback
{
    public void update(Bitmap image)
    {
        ...
    }
}
0 голосов
/ 31 декабря 2011

Во-первых, ImageThread, вероятно, должен либо расширять Thread, либо переименовываться во что-то вроде ImageUpdateTask.

Как вы упомянули в своем вопросе, причина, по которой его трудно использовать повторно, заключается в том, что он слишком сильно связан.Эту проблему можно решить путем абстрагирования методов от отдельных интерфейсов.

public interface Receiver<T> {
    public void pass(T t);
}

-

public class ImageThread extends Thread {
    private Bitmap image;
    private final String url;
    private final Receiver<Bitmap> updater;

    public ImageThread(String url, Receiver<Bitmap> updater) {
        this.url = url;
        this.updater = updater;
    }

    @Override
    public void run() {
        Bitmap img =  downloadImage.connectServerForImage(this.url);
        //data processing

        image = img;
        updater.pass(image);
    }
}

-

public class CustomEventFieldUpdater implements Receiver<Bitmap> {
    @Override
    public void pass(Bitmap image) {
    //TODO
    }
}

-

public class CustomEntryFieldUpdater implements Receiver<Bitmap> {
    @Override
    public void pass(Bitmap image) {
    //TODO
    }
}
...