大家好,我想用handlerThread建立子线程,在子线程里面进行查询数据库中的数据操作并显示在ListView中,
请问具体怎么做啊,是在Message里面写查询语句传到HandleMessage()里面处理还是直接在HandleMessage()里面处理呢?谢谢大侠们了、求指教

解决方案 »

  1.   


    private Thread thread=new Thread(new Runnable() {

    @Override
    public void run() {
    String result="查询结果"; 
    Bundle bundle=new Bundle();
    bundle.putString("result", result); //把查询结果放在Bundle对象中
    Message message =new Message();
    message.setData(bundle); //把bundle放在Message对象中
    handler.sendMessage(message);
    }
    }); private Handler handler = new Handler() {
    @Override
    public void dispatchMessage(Message msg) {
    Bundle bundle=msg.getData(); //得到Bundle
    String result=bundle.getString("result"); //取出存放在里面的数据
    tvResult.setText(result); //设置查询结果显示到控件
    } };
      

  2.   


    谢谢大侠,不过我是想调用数据库中的db.query()方法,这个方法是Cursor类型的,而且我是想放在ListView中
    HandlerThread handerThread=new HandlerThread ("sub_hander");
    handerThread.start();
    MyHandler myHandler=new MyHandler(handerThread.getLooper());
    msg.what=1;
    Dialog d=ProgressDialog.show("参数忽略");
    msg.sendtoTaiget();}}
    class MyHandler extends Handler{{
    public MyHandler(Looper looper){
     suoer(looper);

      public void HandleMessage(Message msg){
       db=myhelper.getwriteable();
        db.query();}
    }
    这样写可以吗?应该怎么修改啊,迷茫
      

  3.   

    ...
    db.query();
    ...有没有执行了这个方法呢?执行正常吗?
      

  4.   


     private Thread thread=new Thread(new Runnable() {
            
            @Override
            public void run() {
       /你的处理,耗时操作在这里
               db=myhelper.getwriteable();
               db.query();
                String result="查询结果"; 
                Bundle bundle=new Bundle();
                bundle.putString("result", result); //把查询结果放在Bundle对象中
                Message message =new Message();
                message.setData(bundle); //把bundle放在Message对象中
                handler.sendMessage(message);
            }
        });    private Handler handler = new Handler() {
            @Override
            public void dispatchMessage(Message msg) {
    //这里就转到了UI线程,只是接受结果,不能是耗时操作
                Bundle bundle=msg.getData();    //得到Bundle
                String result=bundle.getString("result");    //取出存放在里面的数据
                tvResult.setText(result);    //设置查询结果显示到控件
            }    };
      

  5.   


    private ListView listView;
    private ListAdapter adapter;
    private Thread thread = new Thread(new Runnable() { @Override
    public void run() {
    Cursor cur = myhelper.getwriteable().query();
    //得到查询结果后实例化adapter
    adapter = new SimpleCursorAdapter(MainActivity.this,
    android.R.layout.simple_list_item_2, cur, new String[] {
    "改成你的", "..." }, new int[] {
    android.R.id.text1, android.R.id.text2 });

    handler.sendEmptyMessage(0);
    }
    }); private Handler handler = new Handler() {
    @Override
    public void dispatchMessage(Message msg) {
    switch (msg.what) {
    case 0:
    //标识为0 则为listView设置适配器
    listView.setAdapter(adapter);
    break;
    default:
    break;
    }
    } };
      

  6.   

    之前在住线程运行的时候是正常的,我把它放在handleMessage()方法里是报异常了,大概是
    only the original thread that created a view hierarchy its views这些异常,我的那个程序大概思路对吧?呵呵。
      

  7.   

    是的 非UI线程不能更改UI线程里的控件。
      

  8.   

    可是我的handleMessage()方法里并没有改变主线程的东西啊?
    我刚做安卓,谢谢大侠耐心教我。那我用你叫我的方法试一下吧,
      

  9.   

       Wdxx extents ListActivity{
    ......OnCreate(){HandlerThread handerThread=new HandlerThread ("sub_hander");
    handerThread.start();
    MyHandler myHandler=new MyHandler(handerThread.getLooper());
    msg.what=1;
    Dialog d=ProgressDialog.show("参数忽略");
    msg.sendtoTaiget();
    }}
    class MyHandler extends Handler{{
    public MyHandler(Looper looper){
     super(looper);
    }  
      public void handleMessage(Message msg){
      Switch(msg.what){
       case 1;
        Database db=Mydbhelper.getWriteabledatabase
             Cursor c= db.query();
       String[] from={.... ...};
       int[]  to={......};
    adapter = new SimpleCursorAdapter(MainActivity.this,
                        android.R.layout.wdxx, c, from,to});
              ListView listview=ListView.getListview();
               listview.setadapter(adapter);      //就是加上这句出的异常,应该把这两句放在那里呢?
               ....
    }}
    }
    }
    }
      

  10.   

    我的电脑不能联网,我是拿别的机器上网的,大概就是这些代码吧。查询还有listView 绑定数据肯定没错,之前测试过,
      

  11.   

    MyHandler类继承自Handler类,当你实例化该类的时候用的线程是handerThread,不属于UI线程了,所有在该类中进行对UI控件更改的操作是不允许的,要想更改UI控件,必须是在UI线程(主线程)中进行操作,你可以在外面申明一个对象 private Handler handler = new Handler() {
            @Override
            public void dispatchMessage(Message msg) {
                switch (msg.what) {
                case 0:
                    //标识为0 则为listView设置适配器
                    listView.setAdapter(adapter);
                    break;
                default:
                    break;
                }
            }    };来接收handerThread发送过来的动作。