2011-06-23 61 views
0

我有一個活動,開始執行一個AsyncTask響應點擊一個按鈕小部件。當它使用setEnabled(false)點擊時,我禁用按鈕。 AsyncTask在Activity完成時調用一個回調方法。我在回調中的Button上調用setEnabled(true)以在AsyncTask完成時重新啓用按鈕。這一切都正常工作,直到AsyncTask執行時方向改變。我已經嘗試了很多不同的事情,以便在發生這種情況時正確啓用/禁用Button,並且我無法使其正常工作。即使在AsyncTask正在執行時方向發生變化,使這項工作正確的方法是什麼?方向更改打破禁用按鈕,而AsyncTask執行

回答

0

我不相信你不需要開始攔截方向的改變。它的切角和它可能會導致你很多頭痛,如果你真的想要做不同的方向加載不同的資源。

根本問題是,AsyncTask對其要更新的按鈕的引用是陳舊的,它指的是舊按鈕。你可以做什麼來解決這個問題是Activity.onRetainNonConfigurationInstanceState()。在方向更改發生的情況下調用此方法,並允許您存儲非特定配置的項目,如運行線程。

你需要的另一件事是你的AsyncTask中的一個方法來設置它應該啓用/禁用的按鈕。當您的活動重新啓動時,您取消設置按鈕,然後在onCreate()中重置它。

實現可能看起來像這樣。

public class MyActivity extends Activity { 
    private static final String NON_CONFIG_KEY = "com.example.NON_CONFIG_KEY"; 
    protected void onCreate(Bundle instanceState) { 
    setContentView(R.layout.main); 
    HashMap<String, Object> nonConfigState = (HashMap<String, Object>) 
     getLastNonConfigurationIntstanceState(); 
    if (nonConfigState != null && nonConfigState.get(NON_CONFIG_KEY) != null) { 
     MyAsyncTask task = (MyAsyncTask) nonConfigState.get(NON_CONFIG_KEY); 
     task.setUiControl(findViewById(R.id.my_button)); 
    } 
    } 

    public Object onRetainNonConfigurationInstanceState() { 
    task.setUiControl(null); 
    // create HashMap, store AsyncTask in it, and return it 
    } 
} 

public MyAsyncTask extends AsyncTask { 

    private Button mControl = null; 
    private boolean shouldUpdateControl = false; 
    private Object mLock = new Object(); 

    public void setUiControl(Button b) { 
    synchronized (mLock) { 
     if (b != null && shouldUpdateControl) { 
     b.setEnabled(true); 
     shouldUpdateControl = false; 
     } 
     mControl = b; 
    } 
    } 

    protected void onPostExecute(Result r) { 
    synchronized (mLock) { 
     if (mControl == null) { 
     shouldUpdateControl = true; 
     } else { 
     mControl.setEnabled(true); 
     } 
    } 
    } 
} 
1

當您的應用程序onCreate方法中的方向chaneg被再次調用並且您已經寫入了onCreate方法中的所有邏輯時。這樣會讓你的應用程序不來的onCreate()方法時,方向改變

添加以下活動申報清單:

android:configChanges="orientation" 

所以它看起來像

<activity android:label="@string/app_name" 
     android:configChanges="orientation|keyboardHidden" 
     android:name=".your.package">