有关Android的Handler的post方法

很奇怪,为什么会eclipse会提示Themethodpost(Runnable)isundefinedforthetypeHandler,post不是Handler的一... 很奇怪,为什么会eclipse会提示The method post(Runnable) is undefined for the type Handler,post不是Handler的一个方法吗?还有The method removeCallbacks(Runnable) is undefined for the type Handler也是,求解释,代码如下:

public class Handler extends Activity {
/** Called when the activity is first created. */
private Button startButton = null;
private Button endButton = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startButton = (Button)findViewById(R.id.startButton);
startButton.setOnClickListener(new StartButtonListener());
endButton = (Button)findViewById(R.id.endButton);
endButton.setOnClickListener(new EndButtonListener());
}
class StartButtonListener implements OnClickListener{

public void onClick(View v) {
//2.调用Handler的post方法,将要执行的线程对象添加到队列当中
handler.post(updateThread);
}

}
class EndButtonListener implements OnClickListener{

public void onClick(View v) {
handler.removeCallbacks(updateThread);

}

}
//1.创建一个Handler对象
Handler handler = new Handler();
//将要执行的操作写在线程对象的run方法中
Runnable updateThread = new Runnable(){
public void run(){
System.out.println("UpdateThread");
//在run方法内部,执行postDelayed或者post方法
handler.postDelayed(updateThread,3000);
}
};
}
展开
 我来答
爱问hill
推荐于2016-05-22 · 知道合伙人软件行家
爱问hill
知道合伙人软件行家
采纳数:2186 获赞数:15507
毕业于苏州大学人力资源管理专业,本科学位。2年IT行业从业经验,致力于互联网中开启自己人生的一番天地。

向TA提问 私信TA
展开全部
我们都知道Handler中的post方法,并且也是经常使用它
handler.post(new Runnable(){
@Override
public void run() {
//do something

}});
用它可以更新一个组件的内容,我们也知道Hanlder中也有一个handler.sendMessage(Message msg)方法,这两个方法有什么区别呢?先看一下Message类中定义一个私有的变量:Runnable callback;
再来看一下handler.post(Runnable callback)方法的源码:
public final boolean post(Runnable r) {
return sendMessageDelayed(getPostMessage(r), 0);
}

再看一下sendMessageDelayed的源码:
public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}

这里面有个关键就是方法getPostMessage(r)这个方法,他将Runnable转成一个Message,他内部到底干了什么呢?看一下他的源码:
private final Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}

这里面就是将Runnable转化成一个Message,其他看他的代码很简单,就是先获取一个空消息Message.obtain(),然后将Message中的callback的值设置成Runnable,这时候就了解到了Message中的callback的作用了!
同时也了解一下View.post(Runnable r)方法的作用:看一下实例代码:
final Button btn = (Button)findViewById(R.id.btn);
btn.post(new Runnable(){
@Override
public void run() {
btn.setText("不是好人");
}
});
}

上面的代码就是更新btn中的内容,同样下面的代码也可以达到这种效果:
Handler handler = new Handler();
final Button btn = (Button)findViewById(R.id.btn);
handler.post(new Runnable(){
@Override
public void run() {
btn.setText("不是好人");
}
});
}

不同是这个是用handler.post方法,一个是用View.post方法,现在来看一下View.post方法的源代码:
public boolean post(Runnable action) {
Handler handler;
AttachInfo attachInfo = mAttachInfo;
if (attachInfo != null) {
handler = attachInfo.mHandler;
} else {
// Assume that post will succeed later
ViewRootImpl.getRunQueue().post(action);
return true;
}
return handler.post(action);
}

方法中主要的功能代码就是attachInfo.mHandler,获取当前线程的hanlder,和我们在一个线程中定义一个Handler的效果是一样的。
Eddic88
2011-01-06
知道答主
回答量:7
采纳率:0%
帮助的人:0
展开全部
Android里边确实是有这个Handler类,但是你这里是自己定义了一个Handler类,所以你用的是自己设计的Handler类,所以会报出上面的错
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lijufenxin
2012-10-10 · 超过14用户采纳过TA的回答
知道答主
回答量:123
采纳率:100%
帮助的人:37.5万
展开全部
package com.example.handleractivity;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
//声明二个按钮控件
private Button startButton=null;
private Button endButton=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//根据控件的id得到代表控件的对象并为二个按钮设置相应的监听器
startButton=(Button)findViewById(R.id.startButton);
endButton=(Button)findViewById(R.id.endButton);
startButton.setOnClickListener(new StartButtonListener());
endButton.setOnClickListener(new EndButtonListener());
}
public class EndButtonListener implements OnClickListener {

@Override
public void onClick(View v) {
handler.removeCallbacks(updateThread);} }
public class StartButtonListener implements OnClickListener {

@Override
public void onClick(View v) {
//调用handler的post方法将要执行的线程对象添加到队列当中
// TODO Auto-generated method stub
handler.post(updateThread);
}

}
//创建一个handler对象
Handler handler=new Handler();
//将要执行的操作写在线程对象的run方法中
Runnable updateThread=new Runnable()
{
public void run(){
System.out.println("UpdateThread");
//在run方法内部执行postDelay或者post方法
handler.postDelayed(updateThread, 3000);

}

};}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
547587
2011-01-12 · TA获得超过132个赞
知道答主
回答量:112
采纳率:0%
帮助的人:98.7万
展开全部
系统的handler才行,就算要改写handler,也是要继承android.os.Handler才行,而不是继承activity
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
5永远爱东元
2012-03-04
知道答主
回答量:32
采纳率:0%
帮助的人:13.2万
展开全部
应该用public class HandlerActivity extends Activity{}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式