我想知道以下兩種方法中的哪一種是使用來自Web服務的數據加載片段的最佳方法。這裏是場景:在片段1中,單擊按鈕時,片段2進入屏幕,片段2中的視圖充滿來自Web服務器的數據。在Android中爲何創建片段的服務請求?
1日的做法:只要按鈕被點擊的片段1請對Web服務的請求,繼續從服務傳來的數據,然後將此數據傳遞給片段2:
public void onClick() //Fragment 1
{
makeRequest();
}
public void handleResponse(Response response){ //Fragment 1
ServiceData data = (ServiceData) response;
Fragment2 fragment2 = new Fragment2(data);
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction.replace(R.id.container, fragment2).commit();
}
//and
protected void onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) //Fragment 2
{
View v = inflater.inflate(R.layout.fragment_2_layout . . .);
Button b = (Button) v.findViewById(. . .);
b.setText(data.getButtonText);
. . .
return v;
}
第二種方法:在片段1中單擊按鈕時,不要發出請求,只需啓動片段2,然後在片段2的onCreateView結束時發出請求,然後用來自服務的數據填充視圖。
public void onClick() //Fragment 1
{
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction.replace(R.id.container, fragment2).commit();
}
protected void onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) //Fragment 2
{
View v = inflater.inflate(R.layout.fragment_2_layout . . .);
Button b = (Button) v.findViewById(. . .);
. . .
makeRequest();
return v;
}
public void handleResponse(Response response){ //Fragment 2
ServiceData data = (ServiceData) response;
b.setText(response.buttonText);
. . .
}
我與第二方法表示擔心:假設服務請求失敗,在這種情況下創建的意見,但沒有填充數據(即按鈕文本未設置,imageviews的圖像不會加載等。)。這可以接受嗎?
我對第一種方法的關注:爲什麼在片段1中請求其數據與片段2相關的請求?
所以,我想知道這2個選項中哪一個最好,還是有其他更好的方法來做到這一點?
感謝
你是否建議讓loadMeIfData函數爲public static並從fragment 1中調用它?在這種情況下,我可能無法在該函數中引用非靜態對象,並且可能需要使每個對象都爲靜態。 – yrazlik 2014-11-08 13:41:18
也不能調用getActivity()方法,並且可能需要創建靜態上下文對象,並且這可能會導致內存泄漏? – yrazlik 2014-11-08 13:42:09
這就是爲什麼activity是函數的一個參數,所以你已經擁有它了。如果你從片段1調用它,你只需調用loadMeIfData(getActivity(),R.id.fragCongainerMain)。如果您有其他需要的對象,請將它們作爲參數傳遞,就像活動一樣。如果你有很多的對象,通過一個接口或類來檢索它們。靜態函數與裸片2一樣可用,因此假設這是您的一個選擇,它不應該更難寫。 – NameSpace 2014-11-08 13:52:02