Android线程:参考来自线程的视图

Android线程:参考来自线程的视图,android,multithreading,performance,user-interface,listview,Android,Multithreading,Performance,User Interface,Listview,我已经尝试在我的Android应用程序中使用线程来提高性能。 在onCreate方法中,我启动了两个线程: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.play); ... new Thread(new Runnable() { public voi

我已经尝试在我的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();
         }
       });
 }
第二个
列表视图

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) {
    ....

         }
       });
 }
private void makeList(){
...
最终ArrayAdapter listAdapter=新的ArrayAdapter(…);
list.post(新的Runnable(){
公开募捐{
list.setAdapter(listAdapter);
list.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
....
}
});
}
计时器
工作正常, 但是
makeList()
中的操作没有完成..所以我的ListView不工作

我的想法是,当活动开始时,定义listView和Chronometer就不那么重要了,所以我将它们延迟到线程中,目的是让活动开始得更快(性能更好)

首先,这是个好主意吗

其次,为什么我的ListView不工作?当我删除
list.post(new Runnable(){
它可以工作,但我认为这在android中不是一个好方法。因为现在视图直接从一个线程更改

第三,我应该在什么时候使用Threads
vs.View.post

任何帮助都会很好,谢谢

问候
FireDragon

首先要记住的是,用户界面的元素—您的
视图
s和
列表视图
s等—必须只能由用户界面线程(即主线程)访问。如果您想从后台线程修改用户界面,您需要实例化一个
处理程序
(在用户界面线程上)并从后台线程向其发送消息和/或可运行文件


听起来有点混乱?幸运的是,Android包含了一个非常强大的类,名为。这正是您需要学习的。您可以将您的后台线程代码放在它的
doInBackground()
成员中,并在
onPostExecute()
中进行UI更新,这比摆弄
新线程()要简单得多
处理程序
s等。

鲁本对异步任务的看法是正确的。但是,如果你想了解线程是如何工作的,我已经详细介绍了。异步任务是一种方法。

尽管我应该说,你粘贴的代码没有显示任何需要在后台线程上运行的内容。设置适配器等都只是UI初始化和操作ld停留在您的UI线程上。但是,从存储或通过网络加载数据-任何类型的缓慢I/O-这都是您需要在后台执行的操作。好的,谢谢您的回答!请不要在文本中使用反勾号(`),而是('),因为反勾号在标记中具有特殊意义。