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