如何一次又一次地调用线程中的方法?

时间:2017-08-07 16:37:01

标签: android

我有一种方法可以将Firebase的数据加载到ArrayList。在此之后,我使用ArrayList来构建RecyclerView。我决定在另一个线程上加载数据。以下是我的代码:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_just);

     citiesRecyclerView = 
     (RecyclerView)findViewById(R.id.recyclerView);

     handler = new Handler()
     {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);


            if(msg.what==1)
            {

                cityAdapter = new 
               CityAdapter(MainActivity.this,cities) ;
               citiesRecyclerView.setAdapter(cityAdapter);

            }
        }
    };

     t = new Thread(new Runnable() {
        @Override
        public void run() {
         //method that loads data into List.If this method was 
         //successfully done,then I send message 1 to Handler

            loadDataFromFirebase();
        }
    });

    t.start();
   //other operations below 
}

希望,一切都可以理解。代码工作正常。我的问题是我需要再次在线程中使用loadDataFromFirebase方法。我想再次致电t.start()以便调用loadDataFromFirebase方法,但错误thread already started。我通过编写这段代码来检查:

   if(t.getState()== Thread.State.NEW)
        t.start();
    else
        someMethod(); 

else声明在上面工作。

我的问题是: 1)loadDataFromFirebase方法是否真的以这种方式在另一个线程上工作? 2)如果发生了什么事,如何在另一个线程中再次调用loadDataFromFirebase方法?我是否需要再次为Thread创建另一个变量?

2 个答案:

答案 0 :(得分:1)

自己处理所有低级别的线程工作并不是一个好主意。

加载到Android你可以:

  1. 使用AsyncTask(但请注意它们有许多缺点,例如某些情况下的上下文泄漏等),
  2. 我建议你进入RxJava - 在你的应用中使用异步工作是一种轻松的方式。
  3. 要从Firebase“下载”数据,您可以使用FCM(推送通知)按需加载数据。
  4. 您的问题: “不止一次启动一个线程永远不合法。特别是,一旦完成执行,线程可能无法重启。”(c)http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#start()

答案 1 :(得分:1)

如果您使用的是firebase SDK,则可以使用实时数据库功能,因此不需要每次都进行查询。

您应该只订阅一次并获取更新。例如:

firebaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // This method is called once with the initial value and again
        // whenever data at this location is updated.
        YourDataObject value = dataSnapshot.getValue(YourDataObject.class);
        Log.d(TAG, "Value is: " + value);
    }

    @Override
    public void onCancelled(DatabaseError error) {
        // Failed to read value
        Log.w(TAG, "Failed to read value.", error.toException());
    }
});

您可以阅读文档here