Java Micro Edition - отправка / получение HTTP с использованием потоков и делегатов (как обновить пользовательский интерфейс) - PullRequest
1 голос
/ 30 апреля 2010

Я создаю приложение для списка покупок, которое в основном загружает ваш список покупок в php-файл, а также загружает все обновления, которые кто-либо еще сделал в список.

Я использую хранилища записей с перечислением записей и объект item

По сути, я хочу иметь возможность отправлять все элементы из хранилища записей в файл php, используя поток. Беда в том, нужно ли передать хранилище записей в поток? и как мне вернуть данные и обновить хранилище записей?

В данный момент я не вижу, как мой класс данных Send будет обновлять хранилище записей основного мидлета.

Заранее спасибо

еди

public GetDataClass(Midlet parentMidlet, String URL, RecordStore tempRecordStore)
{
    try
    {
        populateLocalRecordStore(tempRecordStore);
        this.parentMidlet = parentMidlet;
        this.URL = URL;
    }
    catch(Exception e)
    {
        System.out.println(e.toString());
    }
}

Заполненное хранилище записей берет хранилище записей, которое было передано, буквально перебирает все записи и вставляет их в локальные rs. Проблема возникает из-за того, что я хочу передать данные обратно в основную форму / хранилище записей

редактировать

Как обновить хранилище записей в главной форме из потока (что было возвращено из http-запроса)

Ответы [ 2 ]

1 голос
/ 01 мая 2010

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

В вашей основной теме:

private Object lock = new Object();
public Object getLock() {
    return lock;
}

public void retrieveDataFromRS() {
    synchronized (getLock()) {
        //read, edit, whatever your RS here and release the lock
    }
}

В вашей ветке GetDataClass:

public void run() {
    synchronized(parentMidlet.getLock()) {
        //read, edit, whatever your RS here and release the lock
    }
}

вы можете синхронизировать их, используя класс или собственный поток, но создание объекта блокировки дает вам больший контроль, так как вы можете остановить один поток, пока не будет больше данных или что вам нужно, используя getLock (). заставьте поток ждать, пока кто-нибудь не уведомит блокировку, и getLock.notify (), чтобы все потоки, ожидающие блокировки, снова запустились.

1 голос
/ 30 апреля 2010

Если я вас правильно понимаю (пожалуйста, дайте мне знать, если нет), вы хотите знать, как вы можете получить возвращаемое значение из фонового потока, который должен обновить пользовательский интерфейс? Поток, который вы используете для заполнения локального хранилища записей.

Итак, если у вас GetDataClass Runnable (созданный с новым потоком (runnable)), вы можете сделать что-то похожее на это:

public class GetDataClass implements Runnable {
    private Midlet parentMidlet;
    private String URL;
    private RecordStore tempRecordStore;

public GetDataClass(Midlet parentMidlet, String URL, RecordStore tempRecordStore) {
        this.parentMidlet = parentMidlet;
        this.URL = URL;
        this.tempRecordStore = tempRecordStore;
}

public void run() {
    try {
         returnData = populateLocalRecordStore(tempRecordStore);
         parentMidlet.updateForm(returnData);
    } catch(Exception e) {
          // log and do exception handling
    }
}
...