解决方案 »
- edittext的onKeyListener是否执行两次
- ndk中.c和.cpp文件一起编译
- android的图片问题
- 如何将canvas对象或bitmap对象生成一个BMP文件?
- 安卓fragment
- SQLite怎么加用户名密码呢?
- 求助:android 删除 GPS 辅助定位信息的API是哪个?
- android中PreferenceScreen在activity中出错
- 手机跨平台开发用什么语言比较好 C++ 还是 erlang? C++ 和erlang 有什么 区别?谢谢!哪个做跨平台简单快?
- android:webview是通过加载html源码来显示内容,如何获取到该网页内容的Url呢
- android应用添加微信分享。
- 如何监听菜单键
使用曲线救国:
handler+Message,机制实现在非ui线程中更新ui的目的。
<?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="1dp"
android:paddingBottom="1dp"
tools:context=".Mp3ListActivity" >
<TextView
android:id="@+id/mp3_name"
android:layout_width="180dp"
android:layout_height="30dp"
android:textSize="10pt"/>
<TextView
android:id="@+id/mp3_size"
android:layout_width="180dp"
android:layout_height="30dp"
android:textSize="10pt"/></LinearLayout>
@Override
public void run() {
// TODO Auto-generated method stub
final List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
for (Iterator iterator = mp3s.iterator(); iterator
.hasNext();) {
Mp3 mp3 = (Mp3) iterator.next();
HashMap<String, String> map = new HashMap<String, String>();
map.put("mp3_name", mp3.getMp3Name());
map.put("mp3_size", mp3.getMp3Size());
list.add(map);
}
SimpleAdapter simpleadapter = new SimpleAdapter(
MyMp3ListActivity.this, list,
R.layout.mp3_item, new String[] {
"mp3_name", "mp3_size" },
new int[] { R.id.mp3_name, R.id.mp3_size });
setListAdapter(simpleadapter);
simpleadapter.notifyDataSetChanged();
}
});注意到没 simpleadapter.notifyDataSetChanged(); 这句
一个是初始化activity的时候set,一个是初始化之后set,这应该有区别的吧,还是得notify下
一:Android中最经典的 “消息机制” 就是 Handler+Message的方式,就拿你上面的代码例子来说,
private class MP3{
String name;
int size;
}
private List<MP3> mList = new ArrayList<MP3>();
private Thread mThread = new Thread(){
public void run() {
Message msg = new Message();
msg.obj = mList;
mHandler.sendMessage(msg);
};
};
假如mThread 就是你用来请求或者下载数据的线程,那么,在mList数据得到之后,把它赋给msg.obj,然后,在主线程中接收数据,
private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
List<MP3> myData = (List<MP3>)msg.obj;
//做你的UI更新,比如List更新
};
};二:第二种方法就是用异步请求的方式请求数据,然后直接把List或者其他组件的更新放在请求结束之后,其实本质上还是要把消息传送到主线程的。
2
3
4
5
6
7
8
9
10
11
12
13
private class MP3{
String name;
int size;
}
private List<MP3> mList = new ArrayList<MP3>();
private Thread mThread = new Thread(){
public void run() {
Message msg = new Message();
msg.obj = mList;
mHandler.sendMessage(msg);
};
};private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
List<MP3> myData = (List<MP3>)msg.obj;
//做你的UI更新,比如List更新
};
};线程+handler,,,通过handler在主线中更新ui
msg.obj = mList;
mHandler.sendMessage(msg);这么写其实不是很好Message msg = mHandler.obtainMessage();
msg.obj = mList;
msg.sendToTarget();
比较好obtainMessage()是从global message pool里取, new是创建新对象, 所以new的效率低
net部分放到 onPostExecute
操作UI部分放到 doInBackground
android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"
/> new Thread(r).start();
h.post(r); //这个好像没啥用? 不知道这个是做什么用。
和Handler没什么关系, 就是创建message方法不同