Service学习——第三篇 异步执行任务
2014-09-21 13:38
211 查看
在服务中异步执行任务
我们可以在服务中写一个内部类来继承android.os包下的异步处理的类AsyncTask,或者从新写一个外部类,本例从新写了一个外部类!~~
然后重写这个类的一些方法:
doInBackground(URL… urls){} //在这个方法中写你要执行的长时间任务
onProgressUpdate(Integer… progress){} //在这个方法中可以报告任务进度
onPreExcute(){} //在这个方法中可以处理一些任务执行前的事情
onPostExcute(Long result){} //在这里做任务执行完成后的事情
这次又加了一个类,就是继承了AsyncTask的那个异步类,代码如下:
packagecom.example.myservice;
importjava.net.URL;
importandroid.content.Context;
importandroid.os.AsyncTask;
importandroid.util.Log;
importandroid.widget.Toast;
public classMyAsyncTask extends AsyncTask<URL, Integer, Long> {
privateContext context;
publicMyAsyncTask(Context context) {
this.context= context;
}
@Override
protectedLong doInBackground(URL... urls) {
//TODO Auto-generated method stub
intcount = urls.length;
longtotalBytesDownload = 0;
for(int i = 0; i < count; i++) {
totalBytesDownload+= DownloadFile(urls[i]);
intprogress = (int) (((i + 1) / (float) count) * 100);
Log.d("doInBackground","进度" + String.valueOf(progress));
}
returntotalBytesDownload;
}
@Override
protectedvoid onProgressUpdate(Integer... values) {
//TODO Auto-generated method stub
super.onProgressUpdate(values);
Toast.makeText(context,"Download" + String.valueOf(values[0]),
Toast.LENGTH_LONG).show();
}
@Override
protectedvoid onPostExecute(Long result) {
//TODO Auto-generated method stub
super.onPostExecute(result);
Toast.makeText(context,"一共下载了" + result + "bytes", Toast.LENGTH_LONG)
.show();
}
//这个方法用来模拟下载一个程序
privateint DownloadFile(URL url) {
try{
Log.d("downloag","enter download");
Thread.sleep(3000);
}catch (Exception e) {
e.printStackTrace();
}
return1000;
}
}
接下来是MyService类:
packagecom.example.myservice;
importjava.net.URL;
import android.app.ProgressDialog;
importandroid.app.Service;
import android.content.Context;
importandroid.content.Intent;
importandroid.os.IBinder;
importandroid.util.Log;
importandroid.widget.Toast;
import android.os.AsyncTask;
public classMyService extends Service {
publicMyService() {
//TODO Auto-generated constructor stub
}
@Override
publicIBinder onBind(Intent arg0) {
//TODO Auto-generated method stub
returnnull;
}
@Override
publicint onStartCommand(Intent intent, int flags,int startId){
//TODO Auto-generated method stub
//我们希望这个服务在被显示停止前一直运行,所以返回“粘性的”状态
Toast.makeText(this,"Service Started", Toast.LENGTH_LONG).show();
try{
//这里创建一个内部类对象,并调用execute方法
MyAsyncTasktask = new MyAsyncTask(MyService.this);
task.execute(newURL("http://www.baidu.com"),new URL("http://www.baidu.com"));
}catch (Exception e) {
Log.d("onStartCommand","出现异常");
e.printStackTrace();
}
returnSTART_STICKY;
}
@Override
publicvoid onDestroy() {
//TODO Auto-generated method stub
super.onDestroy();
Toast.makeText(this,"Service Stopped", Toast.LENGTH_LONG).show();
}
}
这样,你在点击那个开始服务的按钮后,活动就不会出现等待状态,可以看到按钮很快会恢复原样,任务后进入后台,开启新线程进行下载,下载完成后会在界面提示!~~~
我们可以在服务中写一个内部类来继承android.os包下的异步处理的类AsyncTask,或者从新写一个外部类,本例从新写了一个外部类!~~
然后重写这个类的一些方法:
doInBackground(URL… urls){} //在这个方法中写你要执行的长时间任务
onProgressUpdate(Integer… progress){} //在这个方法中可以报告任务进度
onPreExcute(){} //在这个方法中可以处理一些任务执行前的事情
onPostExcute(Long result){} //在这里做任务执行完成后的事情
这次又加了一个类,就是继承了AsyncTask的那个异步类,代码如下:
packagecom.example.myservice;
importjava.net.URL;
importandroid.content.Context;
importandroid.os.AsyncTask;
importandroid.util.Log;
importandroid.widget.Toast;
public classMyAsyncTask extends AsyncTask<URL, Integer, Long> {
privateContext context;
publicMyAsyncTask(Context context) {
this.context= context;
}
@Override
protectedLong doInBackground(URL... urls) {
//TODO Auto-generated method stub
intcount = urls.length;
longtotalBytesDownload = 0;
for(int i = 0; i < count; i++) {
totalBytesDownload+= DownloadFile(urls[i]);
intprogress = (int) (((i + 1) / (float) count) * 100);
Log.d("doInBackground","进度" + String.valueOf(progress));
}
returntotalBytesDownload;
}
@Override
protectedvoid onProgressUpdate(Integer... values) {
//TODO Auto-generated method stub
super.onProgressUpdate(values);
Toast.makeText(context,"Download" + String.valueOf(values[0]),
Toast.LENGTH_LONG).show();
}
@Override
protectedvoid onPostExecute(Long result) {
//TODO Auto-generated method stub
super.onPostExecute(result);
Toast.makeText(context,"一共下载了" + result + "bytes", Toast.LENGTH_LONG)
.show();
}
//这个方法用来模拟下载一个程序
privateint DownloadFile(URL url) {
try{
Log.d("downloag","enter download");
Thread.sleep(3000);
}catch (Exception e) {
e.printStackTrace();
}
return1000;
}
}
接下来是MyService类:
packagecom.example.myservice;
importjava.net.URL;
import android.app.ProgressDialog;
importandroid.app.Service;
import android.content.Context;
importandroid.content.Intent;
importandroid.os.IBinder;
importandroid.util.Log;
importandroid.widget.Toast;
import android.os.AsyncTask;
public classMyService extends Service {
publicMyService() {
//TODO Auto-generated constructor stub
}
@Override
publicIBinder onBind(Intent arg0) {
//TODO Auto-generated method stub
returnnull;
}
@Override
publicint onStartCommand(Intent intent, int flags,int startId){
//TODO Auto-generated method stub
//我们希望这个服务在被显示停止前一直运行,所以返回“粘性的”状态
Toast.makeText(this,"Service Started", Toast.LENGTH_LONG).show();
try{
//这里创建一个内部类对象,并调用execute方法
MyAsyncTasktask = new MyAsyncTask(MyService.this);
task.execute(newURL("http://www.baidu.com"),new URL("http://www.baidu.com"));
}catch (Exception e) {
Log.d("onStartCommand","出现异常");
e.printStackTrace();
}
returnSTART_STICKY;
}
@Override
publicvoid onDestroy() {
//TODO Auto-generated method stub
super.onDestroy();
Toast.makeText(this,"Service Stopped", Toast.LENGTH_LONG).show();
}
}
这样,你在点击那个开始服务的按钮后,活动就不会出现等待状态,可以看到按钮很快会恢复原样,任务后进入后台,开启新线程进行下载,下载完成后会在界面提示!~~~
相关文章推荐
- Service学习——第五篇 使用IntentService在单独线程上执行异步任务
- Service学习——第四篇 在服务中执行重复的任务
- Android使用IntentService执行异步任务
- Service学习——第二篇(模拟执行长时间任务)
- jQuery源码学习——event.special用于执行异步任务的实践
- android学习 豆瓣 自定义Progressbar 异步任务加载数据等
- ScheduledExecutorService执行周期性或定时任务
- ScheduledExecutorService执行周期性或定时任务
- 使用ASP.NET实现Windows Service定时执行任务
- 执行异步任务执行时,公共提示框
- IOS开发(62)之GCD上异步执行非UI任务
- android学习 豆瓣 自定义Progressbar 异步任务加载数据等
- spring执行同步任务和异步任务
- ScheduledExecutorService执行周期任务
- 异步或多线程支持一个任务执行完成
- Spring Batch任务的异步执行
- play framework学习(二) Play framework 1.2.3 Jobs定时任务、异步任务、引导任务、触发任务、关闭任务
- 使用ASP.NET实现Windows Service定时执行任务
- play framework学习笔记之 非HTTP环境下执行任务使用job
- java 异步执行任务,返回进度