我尝试在我的Android应用程序中使用线程来获得更好的性能。在onCreate方法中,我启动了两个线程:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.play);
...
new Thread(new Runnable() {
public void run() {
makeList();
}
}).start();
new Thread(new Runnable() {
public void run() {
setChronometer();
}
}).start();
} 在这些方法中,我更改了视图的一些设置。(无重大事件)
首先是一个天文数字:
private void setChronometer(){
time.post(new Runnable() {
public void run() {
time.setFormat("Time: %s");
time.setBase(SystemClock.elapsedRealtime());
time.start();
}
});
}第二个ListView
private void makeList(){
...
final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(...);
list.post(new Runnable() {
public void run() {
list.setAdapter(listAdapter);
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
....
}
});
}Chronometer工作正常,但是makeList()中的操作没有完成。所以我的ListView不工作了!
我的想法是,当活动开始时,定义listView和计时器就不那么重要了,所以我在线程中推迟了它们,目的是让活动启动得更快(性能更好)。
首先,这是一个好主意吗?
其次,为什么我的ListView不工作?当我移除list.post(new Runnable() {时,它可以工作,但我认为这在安卓系统中不是一个好方法。因为现在视图是从线程直接更改的。
第三,什么时候应该使用线程vs.View.post
任何帮助都是最好的,谢谢!
问候FireDragon
发布于 2010-12-07 19:03:52
首先要记住的是,UI的元素-您的View和ListView等-只能由您的UI线程(即,您的主线程)访问。如果你想从后台线程修改你的UI,你需要实例化一个Handler (在你的UI线程上)并从你的后台线程向它发送消息和/或可运行的东西。
听起来有点凌乱?幸运的是,安卓包含了一个非常强大的类,叫做AsyncTask,这正是你忙于学习所需要的。你把你的后台线程代码放在它的doInBackground()成员中,在onPostExecute()中进行UI更新,这比摆弄new Thread()和Handler等要简单得多。
发布于 2011-01-23 02:41:22
鲁本关于AsyncTask的看法是对的。但是,如果您想了解线程是如何工作的,我已经详细介绍了various approaches on blog。尽管如此,AsyncTask还是不错的选择。
https://stackoverflow.com/questions/4375030
复制相似问题