我最近在做外汇项目,用的是ListView视图来显示外汇数据,我的数据是从服务器中通过socket得到数据,但是我没有思路在ListView中实时更新外汇数据,服务器发送数据过来,通过过滤自己想要的货币对数据实时更新数据,有的货币对数据是不会变化的,只是哪几对有变化就更新。望大侠提出一些详细的解决思路。我下面的代码可以从服务器中得到显示出来,现在是在 ListView实时更新数据不能得到解决。
代码如下:package com.jhconn.KVB_android.main;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;import com.jhconn.KVB_android.util.CCDB_Helper;public class ShowCurrencyPair extends Activity { private final static String[] currencyPair = new String[] { "USDCHF",
"GBPUSD", "USDJPY", "EURUSD", "USDCAD", "EURGBP", "EURJPY",
"GBPJPY", "GBPCHF", "NZDUSD", "NZDJPY", "NZDAUD", "AUDUSD",
"AUDJPY", "AUDNZD", "EURAUD", "NZDCHF", "AUDCHF", "USDCNY" }; private final String DEBUG_TAG = "showcurrencyPair";
private String msg = null;
private PrintWriter out = null;
private BufferedReader br = null;
private String[] s = new String[100]; private int[] to = null;
private String[] from = null; private Socket socket = null;
private int j = 0;
private Boolean iscurrencypair = false;
private static final int SERVERPORT = 15000;
private static final String SERVERIP = "192.168.9.10";
private ListView lv = null;
private List<HashMap<String, String>> fillMaps = null; private Cursor cursor = null;
private static final String TABLE_RATE = "rates";
private DataBaseLayer dataBaseLayer; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.currencypair);
setTheme(R.style.Transparent);
lv = (ListView) findViewById(R.id.listview); from = new String[] { "rowid", "forex", "bid", "ask" };
to = new int[] { R.id.item1, R.id.item2, R.id.item3, R.id.item4 };
fillMaps = new ArrayList<HashMap<String, String>>(); Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
String message = "request" + "\r\n";
try {
// 创建Socket
socket = new Socket(SERVERIP, SERVERPORT);
// 向服务器发送消息
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true);
out.println(message);
out.println(message); // 接收来自服务器的消息
br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
msg = br.readLine();
while ((msg = br.readLine()) != null) {
HashMap<String, String> map = new HashMap<String, String>();
s = msg.split(" ");
if (isCurrencyPair(s[0])) {
map.put("forex", s[0]);
map.put("bid", s[1]);
map.put("ask", s[2]);
fillMaps.add(map);
iscurrencypair = false;
}
}
// // 关闭流
// out.close();
// br.close();
// // 关闭Socket
// socket.close();
} catch (Exception e) {
Log.e(DEBUG_TAG, e.toString());
}
}
}); SimpleAdapter adapter = new SimpleAdapter(this, fillMaps,
R.layout.listview_chart, from, to);
lv.setAdapter(adapter);
lv.setOnItemSelectedListener(l);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
}
});
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
return false;
}
}); lv.setScrollContainer(true);
} OnItemSelectedListener l = new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
} public void onNothingSelected(AdapterView<?> parent) {
}
}; @Override
public boolean dispatchKeyEvent(KeyEvent event) {
return super.dispatchKeyEvent(event);
} public Boolean isCurrencyPair(String msg) {
for (int i = 0; i < currencyPair.length; i++) {
if (currencyPair[i].equals(msg)) {
iscurrencypair = true;
break;
}
}
return iscurrencypair;
} // {zhangzhiyuan
// 将数据库中数据全部取出并放到记录集合中
public Cursor getAllDate() {
CCDB_Helper dbHelper = new CCDB_Helper(null, dataBaseLayer, "rates_db");
SQLiteDatabase db = dbHelper.getReadableDatabase();
String str_sql = "SELECT * FROM " + TABLE_RATE;
cursor = db.rawQuery(str_sql, null);
return cursor;
}
// }
}
代码如下:package com.jhconn.KVB_android.main;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;import com.jhconn.KVB_android.util.CCDB_Helper;public class ShowCurrencyPair extends Activity { private final static String[] currencyPair = new String[] { "USDCHF",
"GBPUSD", "USDJPY", "EURUSD", "USDCAD", "EURGBP", "EURJPY",
"GBPJPY", "GBPCHF", "NZDUSD", "NZDJPY", "NZDAUD", "AUDUSD",
"AUDJPY", "AUDNZD", "EURAUD", "NZDCHF", "AUDCHF", "USDCNY" }; private final String DEBUG_TAG = "showcurrencyPair";
private String msg = null;
private PrintWriter out = null;
private BufferedReader br = null;
private String[] s = new String[100]; private int[] to = null;
private String[] from = null; private Socket socket = null;
private int j = 0;
private Boolean iscurrencypair = false;
private static final int SERVERPORT = 15000;
private static final String SERVERIP = "192.168.9.10";
private ListView lv = null;
private List<HashMap<String, String>> fillMaps = null; private Cursor cursor = null;
private static final String TABLE_RATE = "rates";
private DataBaseLayer dataBaseLayer; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.currencypair);
setTheme(R.style.Transparent);
lv = (ListView) findViewById(R.id.listview); from = new String[] { "rowid", "forex", "bid", "ask" };
to = new int[] { R.id.item1, R.id.item2, R.id.item3, R.id.item4 };
fillMaps = new ArrayList<HashMap<String, String>>(); Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
String message = "request" + "\r\n";
try {
// 创建Socket
socket = new Socket(SERVERIP, SERVERPORT);
// 向服务器发送消息
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true);
out.println(message);
out.println(message); // 接收来自服务器的消息
br = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
msg = br.readLine();
while ((msg = br.readLine()) != null) {
HashMap<String, String> map = new HashMap<String, String>();
s = msg.split(" ");
if (isCurrencyPair(s[0])) {
map.put("forex", s[0]);
map.put("bid", s[1]);
map.put("ask", s[2]);
fillMaps.add(map);
iscurrencypair = false;
}
}
// // 关闭流
// out.close();
// br.close();
// // 关闭Socket
// socket.close();
} catch (Exception e) {
Log.e(DEBUG_TAG, e.toString());
}
}
}); SimpleAdapter adapter = new SimpleAdapter(this, fillMaps,
R.layout.listview_chart, from, to);
lv.setAdapter(adapter);
lv.setOnItemSelectedListener(l);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
}
});
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
return false;
}
}); lv.setScrollContainer(true);
} OnItemSelectedListener l = new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
} public void onNothingSelected(AdapterView<?> parent) {
}
}; @Override
public boolean dispatchKeyEvent(KeyEvent event) {
return super.dispatchKeyEvent(event);
} public Boolean isCurrencyPair(String msg) {
for (int i = 0; i < currencyPair.length; i++) {
if (currencyPair[i].equals(msg)) {
iscurrencypair = true;
break;
}
}
return iscurrencypair;
} // {zhangzhiyuan
// 将数据库中数据全部取出并放到记录集合中
public Cursor getAllDate() {
CCDB_Helper dbHelper = new CCDB_Helper(null, dataBaseLayer, "rates_db");
SQLiteDatabase db = dbHelper.getReadableDatabase();
String str_sql = "SELECT * FROM " + TABLE_RATE;
cursor = db.rawQuery(str_sql, null);
return cursor;
}
// }
}
解决方案 »
- root后,修改android系统时间不成功
- android 网络运营商
- VB写的服务端,android写的客户端,在模拟器上能通信,把android客户端按到手机上就不连接不上了
- 怎样获得 Android 的工程目录,并读写其中的文件。
- android里调用c++程序生成.so后 调用失败
- 关于Ril 驱动代码的问题
- Android ProgressBar 的使用教程
- 求 论坛帖子详情页面思路(如豆瓣,汽车之家,百度贴吧)
- Android中EditText的hint设置字体的大小
- Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件
- @Override无效的原因是什么?
- 请问:如何在代码中重启手机?
所以你取数据和其它是在一个UI线程里, 不卡才怪.
New thread().start()用来取Socket数据,取完后得到一个List或者其它的形式,然后再组装成Adapter里需要的数据,比如你这里是List<map>,然后才Handler.post(new Runnable(){NotifyXX})可以用后台服务,也可以设置定时器处理Socket数据的.最好是将它放在后台,运行.Android.Process
有一个设置线程为Background,具体我忘了.
当滚动到下面时才调用 Getview,
那么你要开辟新的线程来监视你的数据是否更新了,如果数据更新了,但是画面没有更新
则
从new Thread(){ public void run(){
try{
你自己的监听代码,通过white(true){ Thread.sleep(time...)}
Message msg =new Message();
msg.obj = 你的数据; //注意obj是 Object类型了
msg.what = 1 ;
mHandler.sendMessage()
}catch(Exception e){
}
}
}Handler mHandler = new Handler(){
handleMessage(msg){
switch(msg.what){
case 1:
int/String/... data = (强制转换)msg.obj;
然后你拿到你的新数据了再放到新的Adapter
再listview.setAdapter(mAdapter);
break;
default : break
}
}
}主要是他的机制,你必须通过Thread 非UI线程发送一个Handler消息去刺激 主UI线程该刷新页面了
否则Thread里是不能直接对界面操作的!必须在Handle里或者系统的callback方法,即onCreate,onstart
,onresume再不行你再告诉我吧