android Service中自定义的Binder如何操作service中的handler 10
//根据文件的下载状态来调整通知栏的状态Handlerhandler=newHandler(){publicvoidhandleMessage(Messagemsg){/...
//根据文件的下载状态来调整通知栏的状态
Handler handler=new Handler() {
public void handleMessage(Message msg) {
//更新下载进度的时候
if(msg.what==updateProgress){
DecimalFormat format=new DecimalFormat("0.00");
String progress=format.format(i);
remoteViews.setTextViewText(R.id.tvHint,"已下载"+progress+"%");
remoteViews.setProgressBar(R.id.progressbar, 100, i, false);
notify.contentView=remoteViews;
notifyManager.notify(NOTIFICATION_ID, notify);
}
//下载成功的时候
else if(msg.what==downLoadSuccess){
remoteViews.setTextViewText(R.id.tvHint,"下载完成");
remoteViews.setProgressBar(R.id.progressbar, 100, 100, false);
notify.contentView=remoteViews;
notifyManager.notify(NOTIFICATION_ID, notify);
if(timer!=null&&task!=null){
timer.cancel();
task.cancel();
}
//notifyManager.cancel(NOTIFICATION_ID);
}
//下载失败的时候
else if(msg.what==downLoadSuccess){
if(timer != null && task != null){
timer.cancel();
task.cancel();
}
notifyManager.cancel(NOTIFICATION_ID);
stopService(new Intent(getApplicationContext(),DownLoadService.class));//stop service
}
}
};
class downloadTaskExecuteBinder extends Binder{
//再此处顺序执行下载任务并将结果返回给MainActivity
public void taskExecute(){
//在这里写文件下载代码
while(i<100){
i+=5;
handler.sendEmptyMessage(updateProgress);
System.out.println(""+i);
}
handler.sendEmptyMessage(downLoadSuccess);
}
}
}
为什么外面调用binder.taskExecute()系统通知栏没有变化啊,应该是handler没有接收到消息,应该怎么改求大神指点啊,没分了。。。。
handler和自定义的Binder都是定义在同一个DownLoadService中,在另一个Activity中绑定了这个service,想在Activity中调用自定义Binder中的一个方法执行,是不是消息发送到Acitivity中去了??? 展开
Handler handler=new Handler() {
public void handleMessage(Message msg) {
//更新下载进度的时候
if(msg.what==updateProgress){
DecimalFormat format=new DecimalFormat("0.00");
String progress=format.format(i);
remoteViews.setTextViewText(R.id.tvHint,"已下载"+progress+"%");
remoteViews.setProgressBar(R.id.progressbar, 100, i, false);
notify.contentView=remoteViews;
notifyManager.notify(NOTIFICATION_ID, notify);
}
//下载成功的时候
else if(msg.what==downLoadSuccess){
remoteViews.setTextViewText(R.id.tvHint,"下载完成");
remoteViews.setProgressBar(R.id.progressbar, 100, 100, false);
notify.contentView=remoteViews;
notifyManager.notify(NOTIFICATION_ID, notify);
if(timer!=null&&task!=null){
timer.cancel();
task.cancel();
}
//notifyManager.cancel(NOTIFICATION_ID);
}
//下载失败的时候
else if(msg.what==downLoadSuccess){
if(timer != null && task != null){
timer.cancel();
task.cancel();
}
notifyManager.cancel(NOTIFICATION_ID);
stopService(new Intent(getApplicationContext(),DownLoadService.class));//stop service
}
}
};
class downloadTaskExecuteBinder extends Binder{
//再此处顺序执行下载任务并将结果返回给MainActivity
public void taskExecute(){
//在这里写文件下载代码
while(i<100){
i+=5;
handler.sendEmptyMessage(updateProgress);
System.out.println(""+i);
}
handler.sendEmptyMessage(downLoadSuccess);
}
}
}
为什么外面调用binder.taskExecute()系统通知栏没有变化啊,应该是handler没有接收到消息,应该怎么改求大神指点啊,没分了。。。。
handler和自定义的Binder都是定义在同一个DownLoadService中,在另一个Activity中绑定了这个service,想在Activity中调用自定义Binder中的一个方法执行,是不是消息发送到Acitivity中去了??? 展开
1个回答
展开全部
你描述不清出。至少我没看清楚。我尝试按照我自己对你描述的问题的理解来作答。
binder.taskExecute()里头你没有涉及到“系统通知栏”的代码,所以当然没有变化!!!
其次,你对于handler的理解有错误。我粗粗点下:
thread A和thread B。A有B的Handler从而能和B通过Handler沟通。B也有A的Handler。当然,这个Handler都是在A或者B构造函数的时候传进去的(例如A exampleA = new A(B's handler);)
至于两个thread如何根据handler沟通?通过Message来沟通。线程A和B都有一个message queue(消息队列)。你构建一个message实例,然后将它加入到(此处具体化,例如放入B里头)线程的message queue里头中。这样线程(从队列里读一条处理一条就可以处理到你加入的Message,用Handler的handleMessage来处理)。(下面用aHandler,bHandler分别表示thread A的handler和B的hanler。)所以aHandler.sendEmptyMessage(int what)就是在添加一只带有what值的Message到A里头。bHandler....类似。
所以,假设我现在是A,我为了告诉B一些东西,我就将我要告诉的B的东西(信息)放入到一个Message中,再将这个Message加入到B的消息队列中。(譬如你此问中,需要将“下载完成”“下载失败”这些信息添加进入message里头)。然后这个message怎么加入到B的消息的队列呢?这就是为什么要在A的构造函数里头传入B的Handler(bHandler)一个引用的原因。
对于你的需求,Handler和Binder功能重复了。要么用Binder,要么用Handler。
至于想在一个activity中调用自定义Binder里头的一个方法,不需要发送消息。只需要在需要调用的地方实例化一个Binder,然后通过这个实例.functionYouNeeded()就行。
欢迎追问。
binder.taskExecute()里头你没有涉及到“系统通知栏”的代码,所以当然没有变化!!!
其次,你对于handler的理解有错误。我粗粗点下:
thread A和thread B。A有B的Handler从而能和B通过Handler沟通。B也有A的Handler。当然,这个Handler都是在A或者B构造函数的时候传进去的(例如A exampleA = new A(B's handler);)
至于两个thread如何根据handler沟通?通过Message来沟通。线程A和B都有一个message queue(消息队列)。你构建一个message实例,然后将它加入到(此处具体化,例如放入B里头)线程的message queue里头中。这样线程(从队列里读一条处理一条就可以处理到你加入的Message,用Handler的handleMessage来处理)。(下面用aHandler,bHandler分别表示thread A的handler和B的hanler。)所以aHandler.sendEmptyMessage(int what)就是在添加一只带有what值的Message到A里头。bHandler....类似。
所以,假设我现在是A,我为了告诉B一些东西,我就将我要告诉的B的东西(信息)放入到一个Message中,再将这个Message加入到B的消息队列中。(譬如你此问中,需要将“下载完成”“下载失败”这些信息添加进入message里头)。然后这个message怎么加入到B的消息的队列呢?这就是为什么要在A的构造函数里头传入B的Handler(bHandler)一个引用的原因。
对于你的需求,Handler和Binder功能重复了。要么用Binder,要么用Handler。
至于想在一个activity中调用自定义Binder里头的一个方法,不需要发送消息。只需要在需要调用的地方实例化一个Binder,然后通过这个实例.functionYouNeeded()就行。
欢迎追问。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询