android定时查询数据库更新界面

张正中 发布于 2014/02/27 16:35
阅读 3K+
收藏 0

package com.mcu;

import static com.mcu.ConstantUtil.SERVER_ADDRESS;
import static com.mcu.ConstantUtil.SERVER_PORT;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Color;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

@SuppressLint("HandlerLeak")
public class BadActivity extends Activity{
 
 ArrayList<String []> dataList = new ArrayList<String []>();
 MyConnector mc = null;
 ListView lv = null;
 
 private SoundPool sp;
 private HashMap<Integer,Integer> spMap;
 
 
 BaseAdapter baContacts = null;
 
 private Handler handler  = new Handler(){
      public void handleMessage(Message msg) {
          super.handleMessage(msg);
          if(msg.what == 1){
           lv.setAdapter(baContacts); 
          }
      }
  };
  
  private Timer timer = new Timer(true);
  private TimerTask task = new TimerTask() {
    public void run() {
      Message msg = new Message();
      msg.what = 1;
      handler.sendMessage(msg);
    }
  };

 @SuppressLint("UseSparseArrays")
 @Override
 protected void onCreate(Bundle savedInstanceState) {   
     sp = new SoundPool(2,AudioManager.STREAM_MUSIC,0);
     spMap = new HashMap<Integer,Integer>();
     spMap.put(1, sp.load(this, R.raw.qiang, 1));
     super.onCreate(savedInstanceState);
    
  baContacts = new BaseAdapter() {

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
    LinearLayout ll = new LinearLayout(BadActivity.this);   //创建线性布局
    ll.setOrientation(LinearLayout.HORIZONTAL);       //
    ImageView iv = new ImageView(BadActivity.this);     //创建ImageView对象
    iv.setScaleType(ImageView.ScaleType.FIT_CENTER);    
    LinearLayout ll2 = new LinearLayout(BadActivity.this);   //创建子线性布局
    ll2.setOrientation(LinearLayout.VERTICAL);      
    TextView tvName = new TextView(BadActivity.this);    // 创建用于显示的TextView
    tvName.setText("箱号:"+dataList.get(position)[0]);    //设置TextView的内容
    tvName.setTextSize(20.5f);          //设置字体大小
    tvName.setTextColor(Color.BLUE);        //设置字体颜色
    tvName.setPadding(5, 0, 0, 0);         //设置边界空白
    TextView tvStatus = new TextView(BadActivity.this);    //创建用于显示的TextView
    tvStatus.setTextSize(18.0f);         //设置这字体大小
    tvStatus.setTextAppearance(BadActivity.this, R.style.content); 
    tvStatus.setPadding(5, 0, 0, 0);        
    tvStatus.setText("工程值:"+dataList.get(position)[1]);   //设置TextView内容
    TextView tv1 = new TextView(BadActivity.this);     //创建用于显示的TextView
    tv1.setTextSize(18.0f);           //设置这字体大小
    tv1.setTextAppearance(BadActivity.this, R.style.content);  
    tv1.setPadding(5, 0, 0, 0);          //设置边界空白
    tv1.setText("模数值:"+dataList.get(position)[2]);    //设置TextView内容
    TextView tv2 = new TextView(BadActivity.this);     //创建用于显示温度值的TextView
    tv2.setTextSize(18.0f);           //设置这字体大小
    tv2.setTextAppearance(BadActivity.this, R.style.content);  
    tv2.setPadding(5, 0, 0, 0);
    tv2.setText("温度值:"+dataList.get(position)[3]);    //设置TextView内容
    TextView tv3 = new TextView(BadActivity.this);     //创建用于显示越限值的TextView
    tv3.setTextSize(18.0f);           //设置这字体大小
    tv3.setTextAppearance(BadActivity.this, R.style.content);
    tv3.setPadding(5, 0, 0, 0);          //设置边界空白
    tv3.setText("是否越限:"+dataList.get(position)[4]);    //设置TextView内容
    ll2.addView(tvName);           //将显示的TextView添加到线性布局
    ll2.addView(tvStatus);           //将显示的TextView添加到线性布局
    ll2.addView(tv1);           
    ll2.addView(tv2);            
    ll2.addView(tv3);            //将显示的ImageView添加到现象布局
    ll.addView(ll2);            //用于在桌面显示信息
    return ll;
   }
   @Override
   public long getItemId(int position) {
    return 0;
   }
   @Override
   public Object getItem(int position) {
    return null;                
   }
   @Override    
   public int getCount() {
    return dataList.size();
   }
  };
  //列表显示contacts.xml
  setContentView(R.layout.contacts);
  lv = (ListView)findViewById(R.id.listFriend);       //获得ListView对象的引用
  
  getDataList();               //调用获取数据
  timer.schedule(task, 0, 60 * 1000);
 }

 //方法:获取数据列表
 public void getDataList(){
  new Thread(){               //开启线程thread
   public void run(){             //独立运行线程
    try{               //try-catch
     mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);     //连接服务器
     mc.dout.writeUTF("<#GETDATA#>");       //发送命令get_data
     int size = mc.din.readInt();        //读取长度
     System.out.println("size = " + size);      //输出数据条数
     boolean b = false;
     for(int i = 0;i < size;i++){        //循环接受信息  
      String diaryInfo = mc.din.readUTF();     //读取信息
      String [] sa = diaryInfo.split("\\|");     //区分
      if(sa[4].equals("越上限")){        //判断条件,坏了就存在列表中
      dataList.add(sa);            //将信息添加到列表中
      b = true;            //标志位置"1"
      }     
     }
     if(b == true){            //判断true
      playSounds(1,1);          //越限报警
     }
     else{              
      sp.pause(spMap.get(1));         //不报警,或者解除警报
     }
    }catch(Exception e){
     e.printStackTrace();
    }
    handler.post(task);
   }
  }.start();
 }
 
 
  public void playSounds(int sound, int number){
         @SuppressWarnings("static-access")
   AudioManager am = (AudioManager)this.getSystemService(this.AUDIO_SERVICE);
         float audioMaxVolumn = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
         float audioCurrentVolumn = am.getStreamVolume(AudioManager.STREAM_MUSIC);
         float volumnRatio = audioCurrentVolumn/audioMaxVolumn;
        
         sp.play(spMap.get(sound), volumnRatio, volumnRatio, 1, number, 1);
     }



}

代码贴出,想要定时查询数据库更新界面,但是出现的问题是界面定时刷新了,但是只查询一次数据库,但是界面数据不变化。。。。。求解决

加载中
1
adgkns
adgkns
建议在每次查询数据,修改数据后,调用Adapter的notifyDataChanged方法更新ListView。
0
人生的过客
人生的过客
建议使用handler 的 postDelayed 方法实现定时刷新线程, timer 不是很好用,不好关闭。 更新的时候,是需要Adapter 的 notifyDataChanged 
返回顶部
顶部