2014-11-06 91 views
1

我的問題是:當我調試類似於如下的代碼時:等待UI作業結束(Android)

someSpinner.setSelection(0); someEditText.setEnabled(true);

然後我看到第一個動作實際上是在第二個動作之後執行的。我的猜測是,微調控制動作被放入某種不立即啓動的異步作業中。我的目標是等到第一個動作完成後再運行第二個動作。 任何人都知道如何實現這一點?

在Eclipse RCP我解決這個類似以下內容:

uiJob1.addJobChangeListener(new JobChangeAdapter() { 
    @Override 
    public void done(IJobChangeEvent event) { 
     if (event.getResult().isOK()) { 
     uiJob2.schedule(); 
     } else { 
      ... 
     } 
    } 
    }); 

    // 2 
    uiJob2.addJobChangeListener(new JobChangeAdapter() { 
    @Override 
    public void done(IJobChangeEvent event) { 
     if (event.getResult().isOK()) { 
     ... 
     } else { 
     ... 
     } 
    } 
    }); 

    uiJob1.schedule(); 
+0

您正在考慮錯誤的方式。但不能說正確的方法是因爲你沒有說**爲什麼**和**你想要做什麼**。以某種方式等待UI更新完成,但絕對是多線程,asycnh OOP環境中的一個有缺陷的設計。 – Simon 2014-11-06 21:11:31

回答

0

其實,這是很常見的Android版:你不能保證所有的動作將發生在同步模式 - 又名順序你已經將它們執行到代碼中 - 當它們是事件驅動的時候。

我想你應該嘗試在您的微調添加OnItemSelectedListener()監聽器,看看該事件也被捕獲你的行動:someSpinner.setSelection(0);

spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { 
     // your code here 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parentView) { 
     // your code here 
    } 

}); 

讓我知道這可能是工作。

感謝, 保羅

0

感謝您快速的解答,保羅。

我已經在微調器上有一個OnItemSelectedListener。在這個監聽器中,有一種情況是我正在執行someEditText.setEnabled(false)。由於命令沒有在同步模式下執行,我的第一篇文章(someEditText.setEnabled(true);)的第二個動作沒有效果: -/

我發現通過調用someSpinner.setSelection(0,false );它在someEditText.setEnabled(true)之前執行;但我不想依賴這個「解決方案」...

+0

你可以給我發一些代碼嗎?我對這種情況非常感興趣,並且想嘗試使用getViewTreeObserver()。 – Paul 2014-11-07 09:32:05