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))所有任务都在同一后台工作线程上运行。我指的是所有的任务