有关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);
}
};
} 展开
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);
}
};
} 展开
5个回答
推荐于2016-05-22 · 知道合伙人软件行家
关注
展开全部
我们都知道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的效果是一样的。
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的效果是一样的。
展开全部
Android里边确实是有这个Handler类,但是你这里是自己定义了一个Handler类,所以你用的是自己设计的Handler类,所以会报出上面的错
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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);
}
};}
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);
}
};}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
系统的handler才行,就算要改写handler,也是要继承android.os.Handler才行,而不是继承activity
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该用public class HandlerActivity extends Activity{}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询