0

我已經實現了從web下載數據,然後在兩個ActionBar.Tab s中顯示它的應用程序。我有一個問題。如果我從一個選項卡切換到另一個選項卡,應用程序將開始另一次下載,而下載未完成時,應用程序將凍結。如果互聯網連接速度慢,它變得非常煩人。我決定將ProgressDialog添加到應用程序以向用戶顯示應用程序正在從網站下載數據。我添加了一段執行ProgressDialogAsyncTask的代碼,該代碼執行下載,但這並沒有幫助。我明白爲什麼出現這種情況,但無法找到怎樣的方式來解決它:(將被安裝到標籤被表示爲Fragment類的實例在ActionBar.Tabs問題之間切換

數據,創建後,該實例將被添加到transaction,只有經過加入mFragment對象transaction,應用切換到另一個標籤

這是tabListener代碼部分:

// ... 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction transaction) { 
    if (mFragment == null) { 
     /* 
     * Creation of ParkFragment is the reason why app locks!! Because in 
     * ParkFragment data is being downloaded from web 
     */ 
     mFragment = new ParkFragment(mUrl, mActivity); 
     /* 
     * mFragment can't be added to transaction until downloading is 
     * finished, that's why app doesn't switch fast 
     */ 
     transaction.add(android.R.id.content, mFragment, mTag); 
    } else { 
     transaction.attach(mFragment); 
    } 
} 

請,如果任何人有任何想法如何實現ProgressDialog,以避免在翼片之間的切換的延遲,與它分享。

謝謝您的閱讀。

更新:我已閱讀這個問題的答案,但不明白如何實施將幫助我管理延遲:Changing Tabs is Slow/Laggy - Using Fragments

UPD:

public class ParkFragment extends ListFragment { 
     private ArrayList<Cinemas> cinema; 
     private CinemasAdapter cinemaAdapter; 
     private String url; 
     private Activity activity; 


     public ParkFragment (String cinema,Activity activ){ 
      url = cinema; 
      activity = activ; 
     } 

     public void onCreate(Bundle savedInstanceState){ 
      super.onActivityCreated(savedInstanceState); 
      cinema = new Handler().handle(url,activity); 
      cinemaAdapter = new CinemasAdapter(activity, R.layout.movie_data_row, cinema); 
      setListAdapter(cinemaAdapter); 
     } 

     @Override 
     public void onListItemClick(ListView l, View v, int position, long id) { 
      Cinemas movie = cinemaAdapter.getItem(position); 
      Intent intent = new Intent (activity, More.class); 
      intent.putExtra("Cinemas", movie); 
      intent.putExtra("data", movie.getBitmap()); 

      Bundle translateBundle = 
        ActivityOptions.makeCustomAnimation(activity, 
        R.anim.slide_in_left, R.anim.slide_out_left).toBundle(); 
        startActivity (intent, translateBundle); 

     } 
} 

回答

1

在你ParkFragment,您可以使用content providersloaders結合。下載數據應在service中處理,該服務完成後,服務通過內容提供者將數據插入數據庫。在你的片段中,加載器將加載數據。

有一個應用程序在任何Android模擬器命名API演示,其具有與內容提供商/裝載機/服務的幾個例子...它的源代碼可以在Android的SDK,網址爲:[Android SDK]/samples/android-x/ApiDemos,其中x是API級別。

我只是這麼想的,但如果你可以分享你的代碼ParkFragment,也許會有另一個問題呢?


編輯

在你ParkFragment,您可以創建一個ResultReceiver(在API 3+可用),把它變成一個Intent並啓動服務下載/處理url。該服務保留ResultReceiver的實例,完成後通過send(int, Bundle)將下載的數據發送回您的片段。 A Bundle可以保存原始數據類型,例如String,int,byte[] ...對於更復雜的數據,您可以創建一個類來容納它,它實現了ParcelableSerializable

Bound Services,您可以直接從片段內調用服務的方法。請注意,服務在主UI線程上運行,因此爲了避免NetworkOnMainThreadException,您需要在您的服務中使用類似Thread的內容。

+0

謝謝你的回答!我已經添加了「ParkFragment」的代碼。我沒有在我的應用程序中使用數據庫..有沒有其他方法可以解決這個問題? – 2013-03-23 14:08:39

+0

@AvanJogia謝謝,我更新了答案。 – 2013-03-23 14:24:31