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

解决方案 »

  1.   

    谢谢你。
    我正是使用的handler,在主线程的handler中获取到了值,但是不知道如何将这个值赋值给intent,启动第二个activity。
      

  2.   


    谢谢你。
    我正是使用的handler,在主线程的handler中获取到了值,但是不知道如何将这个值赋值给intent,启动第二个activity。
      

  3.   

    每次都比我快一步,如上所说,handler就OK。子线程通过message通知hander。
      

  4.   

    每次都比我快一步,如上所说,handler就OK。子线程通过message通知hander。
    感谢回复。
    我正是使用的handler,在主线程的handler中获取到了值,但是不知道如何将这个值赋值给intent,启动第二个activity。请问如何 讲handler取的值,赋给intent?
      

  5.   

    你详细说明一下你的需求。
    得到数据后是要跳转到另一个activity?
      

  6.   


    感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。现在困难就是,主线程的handler能获取子线程传来的数据,但是如何传给intent。intent在按钮的监听器里面,好像获取不到handler的值。
      

  7.   


    感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。现在困难就是,主线程的handler能获取子线程传来的数据,但是如何传给intent。intent在按钮的监听器里面,好像获取不到handler的值。 哦。明白你的意思了。数据是可以传递过去。但,handler里是不可能完成intent跳转的。
      

  8.   


    感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。现在困难就是,主线程的handler能获取子线程传来的数据,但是如何传给intent。intent在按钮的监听器里面,好像获取不到handler的值。 哦。明白你的意思了。数据是可以传递过去。但,handler里是不可能完成intent跳转的。
    是啊,只能是监听器跳转,所以 我现在不知道怎么讲handler的数据传递给intent。请问有什么好的方法吗?
      

  9.   


    感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给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));
    }

      

  10.   


    刚才解决问题去了……再推荐个笨方法……在按钮方法里判断那个变量if(mIntentData!=null){就执行跳转,跳转后mIntentData=null(或者类似)}
    而这个mIntentData由handler那边负责更新数据(赋值),就是传的数据
      

  11.   


    刚才解决问题去了……再推荐个笨方法……在按钮方法里判断那个变量if(mIntentData!=null){就执行跳转,跳转后mIntentData=null(或者类似)}
    而这个mIntentData由handler那边负责更新数据(赋值),就是传的数据你的意思是两个activity都有各自的handler?第二个activity的handler接收第一个activity的handler?谢谢回复。
      

  12.   


    感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给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));
    }

    谢谢你的建议,不过好像获取数据时间很长
      

  13.   

     intent 有个putextry 之类的方法,把得到的数据 放到这个里面就可以传递给另外的Activity了,或者定义个静态变态 在新的Activity引用
      

  14.   


    感谢回复。页面上有一个按钮,点一下,子线程从网络下数据,然后传给intent,然后启动第二个activity。现在困难就是,主线程的handler能获取子线程传来的数据,但是如何传给intent。intent在按钮的监听器里面,好像获取不到handler的值。 哦。明白你的意思了。数据是可以传递过去。但,handler里是不可能完成intent跳转的。
    尝试下用广播,肯定可以,不过麻烦了,不过你可以学习下广播
      

  15.   

    谢谢回复。我的意思是,从handler中拿到的数据,如何传到intent中。
    activity之间跳转我晓得。请问有什么好方法?
      

  16.   


    刚才解决问题去了……再推荐个笨方法……在按钮方法里判断那个变量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;
            }
    }
      

  17.   


    刚才解决问题去了……再推荐个笨方法……在按钮方法里判断那个变量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();
    }

    }
    }
      

  18.   

    你代码里的@Override
                public void handleMessage(Message msg) {
                    tieBaItemList=(ArrayList<HashMap<String, String>>) msg.obj;
                    super.handleMessage(msg);
                }貌似是违规的……
    用switch case的方法判断msg.what就像我写的那样……
    再试试还有确定list是哪里没取到值,多打印几处,是线程里就没获取到,还是handler里没获取到,还是传给下一个activity没获取到~
      

  19.   

    你代码里的@Override
                public void handleMessage(Message msg) {
                    tieBaItemList=(ArrayList<HashMap<String, String>>) msg.obj;
                    super.handleMessage(msg);
                }貌似是违规的……
    用switch case的方法判断msg.what就像我写的那样……
    再试试还有确定list是哪里没取到值,多打印几处,是线程里就没获取到,还是handler里没获取到,还是传给下一个activity没获取到~谢谢你的指点,小弟才学编程,规范不详,请问这个违规是什么情况?为什么不能直接取值?
    还有,我猜测可能是主线程执行太快,没有等待子线程执行完返回数据,请问这种情况怎么解决?再次表示感谢。
      

  20.   

    你代码里的@Override
                public void handleMessage(Message msg) {
                    tieBaItemList=(ArrayList<HashMap<String, String>>) msg.obj;
                    super.handleMessage(msg);
                }貌似是违规的……
    用switch case的方法判断msg.what就像我写的那样……
    再试试还有确定list是哪里没取到值,多打印几处,是线程里就没获取到,还是handler里没获取到,还是传给下一个activity没获取到~现在能取到值,但是需要点击按钮两次,不知道为什么?难道是主线程等待子线程返回数据?
      

  21.   


    应该是handleMessage是时时刻刻的从MessageQueen里取消息的,所以你不指定具体消息,它不知道如何执行
    这是我的理解……源码没看出啥……
      

  22.   


    代码貌似没发全,没看到线程在哪start的
    你可以在收到消息后Toast.make一下,看是不是执行次数和点击次数是否一样。
    handleMessage的确是等待子线程发消息