0%

用Handler在线程间传送数据

之前一直都把耗时操作放在新线程里处理,包括添加修改ListView的Item,处理完了再用handler发个EmptyMessage,执行listAdapter.notifyDataSetChanged(),但我发现用这种方法经常会出现java.lang.IllegalStateException:The content of the adapter has changed but ListView did not receive a notification异常.即使在notifyDataSetChanged()前把listview隐藏。 其实可以通过把数据传给handler,添加删除清空什么的操作都让handler来处理,这样就不会出错。 传送数据是用Bundle,用过Intent应该很熟悉,不解释:

package com.pocketdigi.test3;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class main extends Activity {
    /** Called when the activity is first created. */
    TextView tv;
    Button btn;
    Handler handler;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv=(TextView)findViewById(R.id.tv);
        btn=(Button)findViewById(R.id.btn);
        handler=new Handler(){

            @Override
            public void handleMessage(Message msg)
            {
                // TODO Auto-generated method stub
                super.handleMessage(msg);

                switch(msg.what)
                {
                case 1:
                    Bundle bundle=msg.getData();
                    System.out.println(bundle.get("add"));
                    break;
                }
            }
            
        };
        btn.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v)
            {
                // TODO Auto-generated method stub
                Message msg = handler.obtainMessage();
                msg.what=1;
                Bundle bundle = new Bundle();
                bundle.putString("add", "sdfasdfasf");
                msg.setData(bundle);
                handler.sendMessage(msg);
//				handler.sendEmptyMessage(0);
            }});
    }
}