Как заставить потоки синхронизироваться в операторе цикла? - PullRequest
0 голосов
/ 17 августа 2011

Я новичок в темах.Я пытаюсь загрузить небольшой массив фотографий.Прямо сейчас я использую Async задачи / потоки, но как мне сделать результат последовательным?Ниже приведена иллюстрация:

Что я хочу:

a[0] = photo1;
a[1] = photo2;
a[2] = photo3;
a[3] = photo4

Что мне дает моя программа.Обратите внимание, что порядок меняется и является случайным:

a[0] = photo[2];
a[1] = photo[1];
a[2] = etc

Вот фрагмент моего кода:

...
for (int i = 0; i < mNoOfContacts; i++) {
    String stringContactUri = storeSettings.getString("contactUri"+i, "");
    if (stringContactUri != ""){
        Uri contactUri = Uri.parse(stringContactUri);
        loadContactInfo(contactUri);
    }
...
private void loadContactInfo(Uri contactUri) {

    AsyncTask<Uri, Void, ContactInfo> task = new AsyncTask<Uri, Void, ContactInfo>() {

        @Override
        protected ContactInfo doInBackground(Uri... uris) {             
            return mContactAccessor.loadContact(getContentResolver(), uris[0]);
        }

        @Override
        protected void onPostExecute(ContactInfo result) {
            Contacts[mNoOfContacts] = result;
        Toast.makeText(getApplicationContext(), mNoOfContacts+"Picked Contact"+Contacts[mNoOfContacts].getDisplayName(), Toast.LENGTH_SHORT).show();
            mNoOfContacts++;
        } 
    };

    task.execute(contactUri);
}
...

Мой код является модификацией демонстрационного приложения Google Android - Визитные карточки.Пожалуйста помоги!Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 августа 2011

Я бы подумал, что по определению «асинхронные задачи» не синхронизированы ... Асинхронный буквально означает «не синхронизирован».Если вы хотите, чтобы он был синхронизирован, просто загрузите их по старинке, сделав URI-вызов, получите свою фотографию и сделайте это снова после загрузки последней фотографии.

0 голосов
/ 17 августа 2011

Что может быть проще всего сделать, так это заставить метод onPostExecute вызывать подпрограмму, которая выполняет сортировку: передать и ContactInfo, и Uri, а затем сравнить Uri с оригиналом и поместить его в нужное место.

В качестве альтернативы измените ваш AsyncTask, чтобы вместо запуска по одному на каждый Ури вы запускали один, пропускали все Uri с и затем шли оттуда.

...