Java 后台HTTP任务

Java 后台HTTP任务,java,android,service,android-asynctask,Java,Android,Service,Android Asynctask,我在我的应用程序上有一个启动页面,我想做的是启动一个后台任务,开始下载东西,以便在用户需要时准备好 比如说一周的照片之类的。 启动屏幕启动(启动后台任务) 启动屏幕完成(后台任务仍在工作) 主屏幕启动(临时“加载”占位符) 用户导航到另一个活动 下载完成 用户返回到主屏幕,主屏幕上更新了本周的图片 现在我知道异步任务,但我听说异步任务在finish()上被取消,而且我还听说它们不会被取消 这种任务,后台加载在服务中处理得最好吗? 有谁能给我提供一个关于在后台加载这样的东西的教程吗 编辑: 人们提

我在我的应用程序上有一个启动页面,我想做的是启动一个后台任务,开始下载东西,以便在用户需要时准备好

比如说一周的照片之类的。

启动屏幕启动(启动后台任务)
启动屏幕完成(后台任务仍在工作)
主屏幕启动(临时“加载”占位符)
用户导航到另一个活动
下载完成
用户返回到主屏幕,主屏幕上更新了本周的图片

现在我知道异步任务,但我听说异步任务在
finish()
上被取消,而且我还听说它们不会被取消

这种任务,后台加载在服务中处理得最好吗? 有谁能给我提供一个关于在后台加载这样的东西的教程吗

编辑:
人们提到UI工作应该在UI中,而非UI工作应该在非UI中。我考虑过处理程序,但是当当前活动不活动时侦听器是否工作

假设我在main中启动一个处理程序,然后切换页面。当我回来时,我很确定主UI不会被更新,因为当我查看另一个页面时,侦听器没有触发

我假设我必须创建一个只用于存储变量或其他东西的类。一旦服务完成,它会将“pic_of_week_loaded”设置为true,当main重新加载时,它会检查此变量。我将如何执行此操作?

考虑使用来完成您的后台工作,这样您就不会与活动生命周期绑定

编辑:根据评论

使用自己的应用程序对象非常简单。就这样创建它:

final public class MyApplication extends Application {
 ....
}
<application
    android:name=".MyApplication"
    ...
然后将清单更新为如下所示:

final public class MyApplication extends Application {
 ....
}
<application
    android:name=".MyApplication"
    ...
考虑用它来做你的背景工作,这样你就不会被束缚在活动的生命周期中

编辑:根据评论

使用自己的应用程序对象非常简单。就这样创建它:

final public class MyApplication extends Application {
 ....
}
<application
    android:name=".MyApplication"
    ...
然后将清单更新为如下所示:

final public class MyApplication extends Application {
 ....
}
<application
    android:name=".MyApplication"
    ...

您可以从
应用程序
类进行扩展,在其中创建一个线程(或异步任务),基本上可以从Internet下载内容。完成后,您可以通知主屏幕活动将内容显示到占位符中。

您可以从
应用程序
类进行扩展,在其中创建一个线程(或异步任务),基本上从Internet下载内容。完成后,您可以通知主屏幕活动,将内容显示到占位符中。

1。好的
AsyncTask
被引入到android中,以提供它所知道的
无痛线程
,但我认为这里不是这样的

2.现在,让UI在UI线程上工作,让非UI在非UI线程上工作总是好的,这从Android的
HoneyComb
版本的到来就成为了规则

3.现在,您需要在后台下载一些内容,其中不包括在UI上反映输出。然后我认为您可以查看java.util.concurrent中的
CountDownLatch


4.否则您可以始终在后台运行
非UI线程

1.好的
异步任务
被引入android,以提供它所知道的
无痛线程
,但我认为这里不是这样的

2.现在,让UI在UI线程上工作,让非UI在非UI线程上工作总是好的,这从Android的
HoneyComb
版本的到来就成为了规则

3.现在,您需要在后台下载一些内容,其中不包括在UI上反映输出。然后我认为您可以查看java.util.concurrent中的
CountDownLatch


4。否则,您可以始终在后台运行
非UI线程。

对于后台任务,我更喜欢使用
线程
处理程序
。线程将在后台执行一些操作,然后当任务完成时,更新处理程序以更新UI。下面是一些示例代码:

Handler handler = new Handler() { //Declare this as a global variable to the class
      @Override
      public void handleMessage(Message msg) {
    //display each item in a single line
          if(msg.obj.equals("update subcat")){
              subcategoryAdapter.notifyDataSetChanged();
          }else if (msg.obj.equals("update products")){
              productsAdapter.notifyDataSetChanged();
          }else if (msg.obj.equals("update cat")){
              categoryAdapter.notifyDataSetChanged();
          }
     }
 };
以下是您的背景任务:

Thread background = new Thread(new Runnable() {

    @Override
    public void run() {
        getSubCategories(((Categories)searchResults.get(pos)).ID);
        handler.sendMessage(handler.obtainMessage(pos, "update subcat"));
        }
    });
    background.start();

我更喜欢在后台任务中使用
线程
处理程序
。线程将在后台执行一些操作,然后当任务完成时,更新处理程序以更新UI。下面是一些示例代码:

Handler handler = new Handler() { //Declare this as a global variable to the class
      @Override
      public void handleMessage(Message msg) {
    //display each item in a single line
          if(msg.obj.equals("update subcat")){
              subcategoryAdapter.notifyDataSetChanged();
          }else if (msg.obj.equals("update products")){
              productsAdapter.notifyDataSetChanged();
          }else if (msg.obj.equals("update cat")){
              categoryAdapter.notifyDataSetChanged();
          }
     }
 };
以下是您的背景任务:

Thread background = new Thread(new Runnable() {

    @Override
    public void run() {
        getSubCategories(((Categories)searchResults.get(pos)).ID);
        handler.sendMessage(handler.obtainMessage(pos, "update subcat"));
        }
    });
    background.start();

另一种选择是使用

我只想在活动中这样做,但确保在显示活动时检查该活动是否仍处于活动状态(确保尚未对其调用onDestroy)


然后我将缓存结果,这样您就不必再次从web加载它(将日期存储在文件名中,这样您就知道图片的日期,这样您就知道缓存中是否已经保存了最新的图片)。

另一种选择是使用

我只想在活动中这样做,但确保在显示活动时检查该活动是否仍处于活动状态(确保尚未对其调用onDestroy)

然后我将缓存结果,这样您就不必再次从web加载它(将日期存储在文件名中,这样您就知道图片的日期,这样您就知道缓存中是否已经保存了最新的图片)。

我将试着解释为什么(1)将全局状态保留在
应用程序
子缓存中,以及(2)对于这种情况,使用
AsyncTask
都是不好的方法

(1) 如果应用程序不在前台,并且当前应用程序中没有正在运行的服务,操作系统可能会终止您的应用程序进程。更多详情请参见本帖:

(2)
AsyncTask
比乍看起来更狡猾。:)例如,默认情况下,如果((OS<1.6)| |(OS>=3.0))所有任务都在同一后台工作线程上运行。我指的是所有的任务