2014-01-30 78 views
1

我有一个名为BuildingActivity的活动,它扩展了ListActivityAndroid - 从后台线程返回ArrayList到活动

onCreate()方法中,我在后台线程中运行7个数据库查询。在后台线程中,我正在从查询返回的数据构建一个ArrayList<String>对象。

现在,我想返回ArrayList<String>对象返回到我的BuildingActivity线程。

这里,即时通讯工作的部分代码:

public class BuildingActivity extends ListActivity { 

     private ProgressBar mProgressBar; 

     public ArrayList<String> buildings; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_building); 

      new Thread(new Runnable() { 

       @Override 
       public void run() { 
        ArrayList<String> list; 

        DataSource dbSource = new DataSource(getApplicationContext()); 
        dbSource.open(); 

        list = dbSource.getBuildingsList(); 

        dbSource.close(); 

        //*** NOW HOW DO I PASS list BACK TO onCreate()? 
        //*** I WANT TO MAKE buildings = list. 

       } 

      }).start(); 

      if(!buildings.isEmpty()) { 
      // do Something. 
      // If i do buildings = list in the background thread, 
      // This will always be executed because the background thread can take 
      // some time to return the data. How do i make sure this part of 
      // code is executed only after the data has been returned? 
     } 
     } 
    } 

我的目标后,这是创建一个列表,从这个返回大厦名单。而在点击建筑物时,另一项活动将开放。我如何解决这个问题?

谢谢!

+0

看下面的方法....当你的列表不是null,那么你可以添加一个条件/ /在这里返回你的列表块到UI线程 –

+0

isnt buildings = list possible?错误是什么? –

+0

@ Rat-a-tat-a-tat料理鼠王有可能。但是随后线程下面的'if'语句将一直执行,因为Activity线程不会等待后台线程完成。 –

回答

1

如何确保只有在返回数据 后才能执行这部分代码?

而不是使用线程在后台使用AsyncTask做任务,这对于在后台执行操作提供doInBackgroundonPostExecute方法来完成后台任务

+0

是的。我读过关于AsyncTask的内容。我甚至通过嵌套一个在我的BuildingActivity中扩展AsyncTask的类来尝试这种方法。但是我无法从onPostExecute()方法访问BuildingActivity的buildings数据成员。 –

+0

@AninditKarmakar:创建一个扩展AsyncTask并在全局onPostExecute中声明所有想要访问的成员的BuildingActivity内部类。请分享AsyncTask相关代码以获得更多帮助 –

0

这里经过的UI线程上运行使用此

public void myMethod(){ 
    Thread background = new Thread(new Runnable(){ 
     @Override 
     public void run(){ 
      Looper.prepare(); 
      //Do your data rerieval work here 
       Runnable r=new Runnable() { 
       @Override 
       public void run() { 
        //return your list from here      
       } 
      }; 
      handler.post(r); 
      Looper.loop(); 
     } 
    }); 
    background.start(); 
}