管理后台下载:Android

时间:2013-06-12 06:47:23

标签: android multithreading android-asynctask

我正在设计一个新闻应用,我需要在用户打开我的应用时下载新文章及其详细故事。我正在做所有这一个后台线程。我的主要关注点是,一旦用户退出应用程序,后台线程就应该停止,以防止用户产生额外的下载费用。

为实现这一目标,我在启动画面中启动后台下载,并继续检查标志变量,让后台进程知道应用程序是否仍在运行。

现在我的问题是:我非常清楚这个标志变量的初始化。我已经在onCreate() Application子类中初始化它,因为它是应用程序启动的点。但我不知道在哪里清除它。我尝试在我的MainActivity的onDestroy()中执行此操作。但是,我发现如果system needs to free memoryonDestroy()通常会在一个活动与另一个活动之间进行转换。因此,即使我在切换屏幕而不是实际关闭应用程序时,也会停止我的后台线程。我该如何处理这种情况?有更聪明的方法来处理这个吗?

3 个答案:

答案 0 :(得分:0)

我认为你不必这样做:要么用户按下“主页”按钮(大多数人都这样做),那么应用程序在后台继续运行是很常见的,因此仍然可以轻松访问他们离开的状态下的用户。你要么提供一个真正杀死应用程序的“关闭应用程序”按钮,它也会杀死应用程序创建的各种线程,你不必担心。

如果你真的想要,可以捕获“主页”点击,并在返回主页之前使用它们来杀死应用程序,如果你的应用程序有0初始化时间,这是一件好事。

答案 1 :(得分:0)

But I've no idea where to clear it. I tried doing it in onDestroy() of my MainActivity.

为了知道活动是否因用户完成而被销毁(使用Back)或Android将重新创建活动,您可以使用isFinishing(); 类似的东西:

protected void onDestroy() {
 super.onDestroy();
 if(isFinishing()) {
 // stop the news feed download
}
}

或者更好的是,停止finish()中的Feed下载:

public void finish() {
  // stop the news feed download
  super.finish();
}

回到上面所说的话:

I'm very clear about initialization of this flag variable. I've initialized it in onCreate() of Application subclass since it is the point where application starts.

即使活动结束,应用程序很可能仍然存在。 Android操作系统将决定何时杀死它。因此,一旦应用程序启动,您将初始化下载,然后您将在onDestroy()或活动中的finish()停止它,具体取决于您的需求,但如果应用程序未停止(最可能)并且你将重新进入新闻活动,你应该开始新闻下载。

我宁愿在onCreate(Bundle savedInstance)的后台启动下载,但当savedInstance为空时(所以我知道这是此活动的第一次创建)并停止它(如果还没有停止)已经单独在finish();

希望它有所帮助!

答案 2 :(得分:-1)

首先从webservice(json或xml)下载数据,你应该使用 AsyncTask (易于使用)

所以我的意思是,使用ondestroy()来清除你的旗帜,当应用程序退出时,也许你可以在按下主页按钮时抓住

在您的活动

中覆盖以下方法
@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);           
}

现在处理这样的关键事件,

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_HOME)
    {
        //do something
    }
    if(keyCode==KeyEvent.KEYCODE_BACK)
    {
        //do something
        finish();
    }
    return false;
}