2014-11-08 38 views
1

我想知道以下兩種方法中的哪一種是使用來自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個選項中哪一個最好,還是有其他更好的方法來做到這一點?

感謝

回答

1
public class Fragment2{ 

    static void loadMeIfData(Activity activity, int fragContanierId){ 

    //1. get data 
    //2. if(data!= null) activity.getFragmentManger(), and add an instance of me. 
    } 
} 

優點: 獲取片段2數據的方法,保存在Fragment 2類中。 如果你放入片段1,你的代碼將變得混亂/非模塊化。

+0

你是否建議讓loadMeIfData函數爲public static並從fragment 1中調用它?在這種情況下,我可能無法在該函數中引用非靜態對象,並且可能需要使每個對象都爲靜態。 – yrazlik 2014-11-08 13:41:18

+0

也不能調用getActivity()方法,並且可能需要創建靜態上下文對象,並且這可能會導致內存泄漏? – yrazlik 2014-11-08 13:42:09

+1

這就是爲什麼activity是函數的一個參數,所以你已經擁有它了。如果你從片段1調用它,你只需調用loadMeIfData(getActivity(),R.id.fragCongainerMain)。如果您有其他需要的對象,請將它們作爲參數傳遞,就像活動一樣。如果你有很多的對象,通過一個接口或類來檢索它們。靜態函數與裸片2一樣可用,因此假設這是您的一個選擇,它不應該更難寫。 – NameSpace 2014-11-08 13:52:02

0

我喜歡的方式1,片段2是沒有數據沒用,所以等待數據片段1,當你有數據顯示片段2

因爲如果你去與方法2,如果數據不可用,那麼您將在片段2中顯示錯誤,之後將由用戶執行什麼操作?你會再試一次嗎?如果用戶想要返回到父屏幕(可能是因爲他的網絡已關閉),該怎麼辦?

因此,兩種方法中的底線,方法1更好。另一方面,Activity也可能調用服務而不是片段。你可以使用回調接口來實現這一點。然後Activity將顯示Fragment 2或錯誤對話框。

相關問題