用handler
例如在主线程创建handler
子线程发消息到这个handlerHandler handler=new Handler(){
@Override
public boolean handleMessage(Message msg){
switch (msg.what){
case 1:
//TODO
break;
}
}
//子线程里
Message msg = new Message();
msg.what = 1;
msg.object=XX;//传对象,还有arg1、arg2……
handler.sendMessage(msg);
例如在主线程创建handler
子线程发消息到这个handlerHandler handler=new Handler(){
@Override
public boolean handleMessage(Message msg){
switch (msg.what){
case 1:
//TODO
break;
}
}
//子线程里
Message msg = new Message();
msg.what = 1;
msg.object=XX;//传对象,还有arg1、arg2……
handler.sendMessage(msg);
我正是使用的handler,在主线程的handler中获取到了值,但是不知道如何将这个值赋值给intent,启动第二个activity。
谢谢你。
我正是使用的handler,在主线程的handler中获取到了值,但是不知道如何将这个值赋值给intent,启动第二个activity。
感谢回复。
我正是使用的handler,在主线程的handler中获取到了值,但是不知道如何将这个值赋值给intent,启动第二个activity。请问如何 讲handler取的值,赋给intent?
得到数据后是要跳转到另一个activity?
感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。现在困难就是,主线程的handler能获取子线程传来的数据,但是如何传给intent。intent在按钮的监听器里面,好像获取不到handler的值。
感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。现在困难就是,主线程的handler能获取子线程传来的数据,但是如何传给intent。intent在按钮的监听器里面,好像获取不到handler的值。 哦。明白你的意思了。数据是可以传递过去。但,handler里是不可能完成intent跳转的。
感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。现在困难就是,主线程的handler能获取子线程传来的数据,但是如何传给intent。intent在按钮的监听器里面,好像获取不到handler的值。 哦。明白你的意思了。数据是可以传递过去。但,handler里是不可能完成intent跳转的。
是啊,只能是监听器跳转,所以 我现在不知道怎么讲handler的数据传递给intent。请问有什么好的方法吗?
感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。现在困难就是,主线程的handler能获取子线程传来的数据,但是如何传给intent。intent在按钮的监听器里面,好像获取不到handler的值。 哦。明白你的意思了。数据是可以传递过去。但,handler里是不可能完成intent跳转的。
是啊,只能是监听器跳转,所以 我现在不知道怎么讲handler的数据传递给intent。请问有什么好的方法吗?
你可以参考一下:private class DataLoadingTask extends AsyncTask<String, Integer, Object>{
ProgressDialog dialog = null;
//加载进度框
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
dialog = new ProgressDialog(xx.this);
dialog.setTitle("提示");
dialog.setMessage("正在进行操作,请稍候");
dialog.show();
}@Override
protected Object doInBackground(String... params) {
// TODO Auto-generated method stub
//耗时网络操作
。return null;
}@Override
protected void onPostExecute(Object result) {
// TODO Auto-generated method stub
dialog.cancel();
//在此处调用启动activity界面就可以了
startActivity(new Intent(xx.this,yy.class));
}
}
刚才解决问题去了……再推荐个笨方法……在按钮方法里判断那个变量if(mIntentData!=null){就执行跳转,跳转后mIntentData=null(或者类似)}
而这个mIntentData由handler那边负责更新数据(赋值),就是传的数据
刚才解决问题去了……再推荐个笨方法……在按钮方法里判断那个变量if(mIntentData!=null){就执行跳转,跳转后mIntentData=null(或者类似)}
而这个mIntentData由handler那边负责更新数据(赋值),就是传的数据你的意思是两个activity都有各自的handler?第二个activity的handler接收第一个activity的handler?谢谢回复。
感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。现在困难就是,主线程的handler能获取子线程传来的数据,但是如何传给intent。intent在按钮的监听器里面,好像获取不到handler的值。 哦。明白你的意思了。数据是可以传递过去。但,handler里是不可能完成intent跳转的。
是啊,只能是监听器跳转,所以 我现在不知道怎么讲handler的数据传递给intent。请问有什么好的方法吗?
你可以参考一下:private class DataLoadingTask extends AsyncTask<String, Integer, Object>{
ProgressDialog dialog = null;
//加载进度框
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
dialog = new ProgressDialog(xx.this);
dialog.setTitle("提示");
dialog.setMessage("正在进行操作,请稍候");
dialog.show();
}@Override
protected Object doInBackground(String... params) {
// TODO Auto-generated method stub
//耗时网络操作
。return null;
}@Override
protected void onPostExecute(Object result) {
// TODO Auto-generated method stub
dialog.cancel();
//在此处调用启动activity界面就可以了
startActivity(new Intent(xx.this,yy.class));
}
}
谢谢你的建议,不过好像获取数据时间很长
感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。现在困难就是,主线程的handler能获取子线程传来的数据,但是如何传给intent。intent在按钮的监听器里面,好像获取不到handler的值。 哦。明白你的意思了。数据是可以传递过去。但,handler里是不可能完成intent跳转的。
尝试下用广播,肯定可以,不过麻烦了,不过你可以学习下广播
activity之间跳转我晓得。请问有什么好方法?
刚才解决问题去了……再推荐个笨方法……在按钮方法里判断那个变量if(mIntentData!=null){就执行跳转,跳转后mIntentData=null(或者类似)}
而这个mIntentData由handler那边负责更新数据(赋值),就是传的数据你的意思是两个activity都有各自的handler?第二个activity的handler接收第一个activity的handler?谢谢回复。我是看你这句话理解的:
页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。这里是下载数据完成后再点击按钮……onClick(View v){
if(mIntentData!=null){
Intent intent=new Intent(MainActivity.this,XXXX.class);
intent.putExtar("data",mIntentData);//数据?如果要传对象,需要对象实现序列化
startActivity(intent);
}
}
Handler handler=new Handler(){
@Override
public boolean handleMessage(Message msg){
switch (msg.what){
case 1:
//把数据存给mIntentData,类型自己定,对象要序列化
break;
}
}
刚才解决问题去了……再推荐个笨方法……在按钮方法里判断那个变量if(mIntentData!=null){就执行跳转,跳转后mIntentData=null(或者类似)}
而这个mIntentData由handler那边负责更新数据(赋值),就是传的数据你的意思是两个activity都有各自的handler?第二个activity的handler接收第一个activity的handler?谢谢回复。我是看你这句话理解的:
页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。这里是下载数据完成后再点击按钮……onClick(View v){
if(mIntentData!=null){
Intent intent=new Intent(MainActivity.this,XXXX.class);
intent.putExtar("data",mIntentData);//数据?如果要传对象,需要对象实现序列化
startActivity(intent);
}
}
Handler handler=new Handler(){
@Override
public boolean handleMessage(Message msg){
switch (msg.what){
case 1:
//把数据存给mIntentData,类型自己定,对象要序列化
break;
}
}和你的代码一样,但是list取不到值。。麻烦你帮我看看代码吧。public class MainActivity extends Activity { private Button saveButton;
private Button searchInTieBaButton;
private Button searchAllTieBaButton;
private EditText tieBaName;
private EditText keyWord1;
private EditText keyWord2;
private ArrayList<HashMap<String, String>> tieBaItemList = null;
GetItemListThread getItemListThread=null;
Handler handler=null;
String tieBaNameStr;
String keyWordStr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saveButton=(Button) findViewById(R.id.saveBtn);
tieBaName=(EditText) findViewById(R.id.tieBaName);
keyWord1=(EditText) findViewById(R.id.keyWord1);
keyWord2=(EditText) findViewById(R.id.keyWord2);
searchInTieBaButton=(Button) findViewById(R.id.searchBtn1);
searchAllTieBaButton=(Button) findViewById(R.id.searchBtn2);
handler=new Handler(){ @Override
public void handleMessage(Message msg) {
tieBaItemList=(ArrayList<HashMap<String, String>>) msg.obj;
super.handleMessage(msg);
}
};
searchInTieBaButton.setOnClickListener(new SearchInTieBaListener());
searchAllTieBaButton.setOnClickListener(new SearchAllTieBaListener());
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
}
class SearchAllTieBaListener implements OnClickListener{
@Override
public void onClick(View v) {
tieBaNameStr="";
keyWordStr=keyWord2.getText().toString();
Intent intent=new Intent(MainActivity.this, ItemListActivity.class);
intent.putExtra("tieBaItemList", (Serializable)tieBaItemList);
System.out.println(tieBaItemList);
// intent.putExtra("tieBaNameStr", tieBaNameStr);
// intent.putExtra("keyWordStr", keyWordStr);
startActivity(intent);
}
} public ArrayList<HashMap<String, String>> showItemsList(String tieBaNameStr, String keyWordStr) {
TieBaItemBiz biz = new TieBaItemBiz();
String encodeNameStr = null;
String encodeKeyStr = null;
try {
encodeNameStr = URLEncoder.encode(tieBaNameStr, "GBK");
encodeKeyStr = URLEncoder.encode(keyWordStr, "GBK");
tieBaItemList = biz.getTieBaItems(1, encodeNameStr,
encodeKeyStr);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (CommonException e) {
e.printStackTrace();
}
return tieBaItemList;
}
class GetItemListThread extends Thread{
@Override
public void run() {
Message msg=handler.obtainMessage();
msg.obj=showItemsList(tieBaNameStr, keyWordStr);
handler.sendMessage(msg);
super.run();
}
}
}
public void handleMessage(Message msg) {
tieBaItemList=(ArrayList<HashMap<String, String>>) msg.obj;
super.handleMessage(msg);
}貌似是违规的……
用switch case的方法判断msg.what就像我写的那样……
再试试还有确定list是哪里没取到值,多打印几处,是线程里就没获取到,还是handler里没获取到,还是传给下一个activity没获取到~
public void handleMessage(Message msg) {
tieBaItemList=(ArrayList<HashMap<String, String>>) msg.obj;
super.handleMessage(msg);
}貌似是违规的……
用switch case的方法判断msg.what就像我写的那样……
再试试还有确定list是哪里没取到值,多打印几处,是线程里就没获取到,还是handler里没获取到,还是传给下一个activity没获取到~谢谢你的指点,小弟才学编程,规范不详,请问这个违规是什么情况?为什么不能直接取值?
还有,我猜测可能是主线程执行太快,没有等待子线程执行完返回数据,请问这种情况怎么解决?再次表示感谢。
public void handleMessage(Message msg) {
tieBaItemList=(ArrayList<HashMap<String, String>>) msg.obj;
super.handleMessage(msg);
}貌似是违规的……
用switch case的方法判断msg.what就像我写的那样……
再试试还有确定list是哪里没取到值,多打印几处,是线程里就没获取到,还是handler里没获取到,还是传给下一个activity没获取到~现在能取到值,但是需要点击按钮两次,不知道为什么?难道是主线程等待子线程返回数据?
应该是handleMessage是时时刻刻的从MessageQueen里取消息的,所以你不指定具体消息,它不知道如何执行
这是我的理解……源码没看出啥……
代码貌似没发全,没看到线程在哪start的
你可以在收到消息后Toast.make一下,看是不是执行次数和点击次数是否一样。
handleMessage的确是等待子线程发消息