Android线程:请参阅线程的视图
我试图在我的Android应用中使用线程来获得更好的性能。 在onCreate
方法,我开始两个线程:Android线程:请参阅线程的视图
@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和天文台是不太重要的,所以我推迟他们的主题,使用的目的,该活动启动更快(更performat)
第一总之,这是一个好主意吗?
其次,为什么我的ListView不工作?当我删除list.post(new Runnable() {
它的作品,但我认为这不是在android的好方法。因为现在视图直接从线程改变。
第三,我应该什么时候使用线程vs.View.post
?
任何帮助将是伟大的,谢谢!
问候 FireDragon
首先要记住的是,你的用户界面的元素 - 您View
S和ListView
小号等 - 只能通过不断的UI线程(即主线程)进行访问。如果你想从后台线程修改你的UI,你需要实例化一个Handler
(在你的UI线程上),并从后台线程发送消息和/或可运行参数。
听起来有点混乱?幸运的是,Android包含一个非常强大的类,名为AsyncTask
,它是,正好是您需要忙于学习。你把你的后台线程的代码在它的doInBackground()
会员,你做你的UI更新在onPostExecute()
,这是不是与new Thread()
和Handler
小号等
虽然我应该说,你粘贴的代码不会显示任何*需要*后台线程。设置适配器等都只是UI初始化,应该留在你的UI线程上。但是,从存储或通过网络加载数据 - 任何种类的慢速I/O - *这就是*您需要在后台执行的操作。 – 2010-12-07 11:05:39
鲁本是正确的大约四周的AsyncTask摆弄哦,所以要简单得多。但是,如果您想了解线程是如何工作的,我已详细说明了various approaches on blog。 AsyncTask是要走的路。
请勿在您的文本中使用反引号(`),但(')反向标记在降价中有特殊含义。 – 2010-12-07 11:11:23