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

+0

请勿在您的文本中使用反引号(`),但(')反向标记在降价中有特殊含义。 – 2010-12-07 11:11:23

首先要记住的是,你的用户界面的元素 - 您View S和ListView小号等 - 只能通过不断的UI线程(即主线程)进行访问。如果你想从后台线程修改你的UI,你需要实例化一个Handler(在你的UI线程上),并从后台线程发送消息和/或可运行参数。

听起来有点混乱?幸运的是,Android包含一个非常强大的类,名为AsyncTask,它是,正好是您需要忙于学习。你把你的后台线程的代码在它的doInBackground()会员,你做你的UI更新在onPostExecute(),这是不是与new Thread()Handler小号等

+0

虽然我应该说,你粘贴的代码不会显示任何*需要*后台线程。设置适配器等都只是UI初始化,应该留在你的UI线程上。但是,从存储或通过网络加载数据 - 任何种类的慢速I/O - *这就是*您需要在后台执行的操作。 – 2010-12-07 11:05:39

鲁本是正确的大约四周的AsyncTask摆弄哦,所以要简单得多。但是,如果您想了解线程是如何工作的,我已详细说明了various approaches on blog。 AsyncTask是要走的路。