2017-08-07 58 views
1

我有一种方法,将数据从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创建另一个变量?

回答

1

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

Accroding到Android您可以:

  1. 使用的AsyncTask(但是请注意,它们有许多缺点,例如在某些情况下等情况下泄漏),
  2. 我可以建议你进入RxJava - 这是一个在您的应用程序中使用异步工作的无痛方式。
  3. 要从Firebase下载数据,您可以使用FCM(推送通知)按需加载数据。

那你的问题: 。“这是从来没有的法律,以启动一个线程不止一次特别是,一个线程可能无法一旦完成执行重启”(C)http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#start()

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

+0

但是我每次都从特定的孩子读取数据(((。我不认为这是可能的,不需要每次查询 – abay

+1

您可以订阅特定孩子的更改 –

+0

我会尝试,我需要做它在主线程? – abay