Как я могу эмулировать получение параметров синхронно в Android? - PullRequest
1 голос
/ 05 марта 2011

Хорошо, я пытаюсь написать провайдера Live Folder, который между вызовом и созданием папки сначала запрашивает у пользователя некоторые параметры.Это работает, пока я не дошёл до того, чтобы попытаться дождаться опций перед созданием папки.Я почти уверен, что это связано с тем, как я пытаюсь ждать активности опций.

Я пытаюсь ждать опций через семафор с 1 слотом.Вот мой основной полупсевдокод:

package mypackage

import <all-my-imports>

public class Folder extends Activity {
    Intent getOptions = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final Intent intent = getIntent();
        final String action = intent.getAction();

        if (LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action)) {           
            try {
                CoreLib.Blocker().acquire();                
                getOptions = new Intent(this, Options.class);
                startActivityForResult(getOptions, 0);              
                CoreLib.Blocker().acquire();

                if(getOptions == null) { 
                    throw new Exception("Live folder canceled."); 
                }

                <create-live-folder-from-options>

                setResult(RESULT_CANCELED);
                finish();
            } catch (Exception e) {
                CoreLib.showToast(e.getMessage(), Toast.LENGTH_LONG);

                setResult(RESULT_CANCELED);
                finish();
            }
        } else {
            setResult(RESULT_CANCELED);
            finish();
        }
    }

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        getOptions = intent;
        CoreLib.Blocker().release();
    }   
}

CoreLib.Blocker() - это семафор, который инициализируется так: new Semaphore(1, true).

Я думал, что он получит семафор, затем запустит действие Options, затем попытается снова получить семафор, который заблокирует его, пока не вернется действие Options, где он затем вызовет release в onActivityResult, а затем onCreate продолжится.Кажется, что он не работает ... просто зависает при втором захвате и все.

Как лучше всего получить параметры от пользователя до создания папки, чтобы я могиспользовать эти опции при создании папки?

ОБНОВЛЕНИЕ: Я также сейчас пытался заменить всю мою маленькую логику семафора пустой while петлей после Вызов действия Options, ожидание общей логической переменной, которая будет перевернута действием Options, когда она будет завершена.Но это также отправляет приложение в забвение прежде, чем оно когда-либо сможет перейти к действию Options.

1 Ответ

0 голосов
/ 06 марта 2011

Понял это ... кажется довольно глупо-глупо очевидным, как только я понял это, но вот оно ...

Вместо того, чтобы помещать мои варианты выбора в отдельное действие, просто поместите макет в действие, которое возвращает намерение LiveFolder домой, и соберите мои варианты там.

Я думал, что вам нужно setResult(RESULT_OK, createLiveFolder()) в переопределении onCreate, не знал, что вы можете отложить его до нажатия кнопки или списка. Как только я понял это, все стало на свои места.

...