2012-11-22 36 views
4

我有一個片段活動,其中包含一個片段,該片段啓動一個Asynctask下載一些數據,我在我的片段實現了一個回調方法,更新適配器和列表視圖中的一些值。我的問題是:這是我的onCreateView方法(重要部分):回調方法參考舊片段

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    list=(PullToRefreshListView)v1.findViewById(R.id.listapull); 
    adapterList=new ListViewAdapter(secciones, mContext); 
} 

,當我同時的AsyncTask運行時,doInBackground()方法會繼續運行,然後在後期執行它觸發旋轉設備監聽器,並開始在我的片段回調方法,這種方法有我的適配器和老引用我的列表視圖: enter image description here

片段及其內容時改變方向時發生,這是正確的,但確實是重建任何人都知道爲什麼回調方法保持引用適配器和列表視圖的方向更改之前創建?

編輯:

我有一個按鈕,執行這樣的的AsyncTask:

asyncRefresh = new PullRefreshTask(taskContext, mContext, secciones); 
asyncRefresh.setUpdatePull2RefreshListener(this); 
asyncRefresh.execute(); 

如果用戶按下按鈕的AsyncTask將設置舊片段作爲聽衆,當一個方向變化在asynctask運行時發生,我認爲激活的回調方法是來自新創建的片段方法的方法,但我不再確定。

編輯2:

我已經解決了我的問題,我在我的第一個編輯說,回調方法被稱爲舊片段。所以我所做的就是救我的AsyncTask的變量在名爲「信息」其他類,並在上創建視圖我這樣做:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     list=(PullToRefreshListView)v1.findViewById(R.id.listapull); 
     adapterList=new ListViewAdapter(secciones, mContext); 
     PullRefreshTasktask task = Info.getAsyncTask(); 
     asyncRefresh = task; 
     asyncRefresh.setUpdatePull2RefreshListener(this); 
    } 

這樣,我在我的

設置我的片段的新基準

setUpdatePull2RefreshListener()運行的AsyncTask的

方法

+0

由於它來自調試器的屏幕,'adapterList'是你的'Fragment'的內部類的一個實例。這可能是問題嗎? – ernazm

回答

1

... d任何人都知道爲什麼回調方法是將參考 保留在適配器和列表視圖中,在方向 更改之前創建的適配器和列表視圖?

(這個回答來自不知道你的回調實現或如何您AsyncTask長相) 爲什麼不回調應該保持參照舊片段?您在該Button的收聽者中設置了當前Fragment實例,然後在任務運行時執行設備輪換。您的Fragment中沒有任何代碼,因爲它在配置更改後重新構建,將更新AsyncTask中的回調實例以指向新的片段。根據您使用Fragment的方式,您可以使用Fragment.setRetainInstance()方法,該方法可以防止銷燬Fragment,以便您的任務即使在輪換後也具有相同的回調實例。還有一位來自Android工程師的an answer關於這個特殊問題。