@devolegf

Как правильно организовать приложение(взаимодействия потоков и UI)?

Добрый день. Прошу помощи в организации приложения. Приложение должно отображать значение тегов получены от ОРС-DA сервера, в реальном времени в простом списке(название тега - значение на текущий момент). Сейчас сделано через IntentService и BroadcastReceiver. Проблема передачи значений с сервиса в ListView, сейчас около 100 значений..
По клику на кнопке вызывается IntentService и в нем происходит получение данных.. Ниже привожу код onHandleIntent:
protected void onHandleIntent(Intent workIntent) {
        // Gets data from the incoming Intent
        String dataString = workIntent.getDataString();
        try{
            server.connect();
            Group group = server.addGroup("root");
            branches = new ArrayList<Branch>(server.getTreeBrowser().browse().getBranches().size());
            getBranchTree(server.getTreeBrowser().browse());
            tags = new ArrayList<Leaf>();
            for (Branch b: branches){
                for(Leaf l:b.getLeaves()){
                    tags.add(l);
                }
            }
            Log.i(LOG_TAG,"TAGS CREATED/ WE CAN READ VALUES FROM SERVER");
            subscribe();

        }catch(Exception ex){
            Log.e(LOG_TAG,ex.getMessage());
        }
    }

///////////////////////////////////////////////
void subscribe() {
        if (access != null) {
            try {
                access.unbind();
            } catch (Exception ex) {
                Log.w(LOG_TAG, ex.getMessage(), ex);
            } finally {
                access = null;
            }
        }
        try {
            access = new SyncAccess(server, 1000);
            for(Leaf l: tags){
                access.addItem(l.getItemId(), new DataCallback() {
                    ItemObject ItemObj = new ItemObject();
                    public void changed(final Item item, final ItemState itemState) {
                        // посылаем промежуточные данные
                        Intent updateIntent = new Intent();
                        updateIntent.setAction("ACTION_UPDATE");
                        updateIntent.addCategory(Intent.CATEGORY_DEFAULT);
                        //JIVariant jVar = itemState.getValue();
                        try{
                            ItemObj.ItemId = "awdasd";//item.getId().toString();
                            ItemObj.ItemQuality = 192;//itemState.getQuality().intValue();
                            ItemObj.ItemTimeStamp = "adas";//itemState.getTimestamp().toString();
                            ItemObj.ItemValue = "value";//itemState.getValue().toString();
                            updateIntent.putExtra("ACTION_UPDATE_OUT", ItemObj);
                        }
                        catch(Exception ex){
                            Log.e(LOG_TAG,ex.getMessage());
                        }
                        sendBroadcast(updateIntent);

                        if (itemState.getQuality ()==192) {
                          //  responseIntent.putExtra(EXTRA_KEY_OUT, extraOut);
                            System.out.println(String.format("Item: %s, Value: %s, Timestamp: %tc, Quality: %d", item.getId(), itemState.getValue(), itemState.getTimestamp(), itemState.getQuality()));
                            Log.i(LOG_TAG, itemState.getValue().toString());
                        }
                    }
                });
            }
            access.bind();

        } catch (Exception ex) {
            Log.w(LOG_TAG, ex.getMessage(), ex);
        }
    }

в функции subscribe я получаю данные: их передаю через ItemObj(Parcelable)/ хотелось бы передавать не только данные основного типа ну и другие( имя - string и значение - JIVariant..). Как можно организовать такую передачу?
Таким способом передаются по одному тегу
Код в BroadcastReceiver
public class UpdateBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //int update = intent.getIntExtra("ACTION_UPDATE_OUT", 0);
            ItemObject Item = (ItemObject)intent.getParcelableExtra("ACTION_UPDATE_OUT");
            Tag t = new Tag(Item.ItemId,Item.ItemValue,Item.ItemQuality);
            tags.add(t);
            tagAdapter.notifyDataSetChanged();
        }
    }

Можно ли передать весь список для отображение в ListView?
Возможно есть другие способы работы после получение данных от сервера?
  • Вопрос задан
  • 169 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Dmtm
Android
Как можно организовать такую передачу?

независимый от UI слой данных (если по быстрому то переменные в Application) и не надо никакого Parсelable,
через бродкаст только уведомление об изменении, ответы сервера пишутся в Application,
потребитель получает уведомление и берет их там, если не получает а только что был создан - все равно берет их там
PS: я бы использовал просто Thread с бесконечным циклом для запросов и EventBus для уведомлений
PPS: ListView умер, только RecycledView
PPPS: по идее, где реальное время - там сокет? а не запросы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы