您的位置:首页 > 其它

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();

}

}

这样,你在点击那个开始服务的按钮后,活动就不会出现等待状态,可以看到按钮很快会恢复原样,任务后进入后台,开启新线程进行下载,下载完成后会在界面提示!~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: