我正在使用一個單例從Web服務中獲取數據並將結果數據對象存儲在ArrayList中。它看起來像這樣:ArrayList長度在單例中得到0
public class DataHelper {
private static DataHelper instance = null;
private List<CustomClass> data = null;
protected DataHelper() {
data = new ArrayList<>();
}
public synchronized static DataHelper getInstance() {
if(instance == null) {
instance = new DataHelper();
}
return instance;
}
public void fetchData(){
BackendlessDataQuery query = new BackendlessDataQuery();
QueryOptions options = new QueryOptions();
options.setSortBy(Arrays.asList("street"));
query.setQueryOptions(options);
CustomClass.findAsync(query, new AsyncCallback<BackendlessCollection<CustomClass>>() {
@Override
public void handleResponse(BackendlessCollection<CustomClass> response) {
int size = response.getCurrentPage().size();
if (size > 0) {
addData(response.getData());
response.nextPage(this);
} else {
EventBus.getDefault().post(new FetchedDataEvent(data));
}
}
@Override
public void handleFault(BackendlessFault fault) {
EventBus.getDefault().post(new BackendlessFaultEvent(fault));
}
});
}
public List<CustomClass> getData(){
return this.data;
}
public void setData(List<CustomClass> data){
this.data = data;
}
public void addData(List<Poster> data){
this.data.addAll(data);
}
public List<CustomClass> getData(FilterEnum filter){
if(filter == FilterEnum.NOFILTER){
return getData();
}else{
// Filtering and returning filtered data
}
return getData();
}
}
數據被正確提取並且列表實際上包含它之後的數據。而且,只按預期創建一個實例。但是,每當我稍後調用getData時,this.data的長度就是0.因此,我也嘗試使用持有DataHelper對象的Application的子類,導致相同的問題。
- 有沒有一種很好的調試方法?在Android Studio中是否有像全局手錶一樣的東西?
- 我的方法有什麼問題嗎?有更好的方法嗎?我主要是一個iOS開發人員,所以Android對我來說很新。我在不同的視圖中顯示ArrayList中的數據,因此只要應用程序運行,我就希望它在ArrayList中存在。
謝謝!
編輯:在列表視圖中的片段實施例使用(僅相關部分):
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
filter = FilterEnum.NOFILTER;
data = DataHelper.getInstance().getData(filter);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
customClassListAdapter = new customClassListAdapter(getActivity(), data);}
EDIT2:增加代碼,我取從Backendless數據,在第一EDIT
改變DataHelper的參照數據的參照EDIT3:我用一個本地EventBus通知有關新數據的列表視圖。這看起來像這樣和工程(初步數據被填充,但如應用過濾器後,我的getData得到的ArrayList是空的):
@Subscribe
public void onMessageEvent(FetchedDataEvent event) {
customClassListAdapter.notifyDataSetChanged();
}
你可以嘗試在setter上添加一個斷點來捕獲它。同樣,你可以在單例初始化後的任何時候輸入以下內容:'DataHelper.getInstance()。getData()' –
你如何使用這個類?如果您不止一次調用setData,它將覆蓋先前設置的數據。它也使構造函數中的「新的ArrayList <>()」成爲廢棄部分。這不一定是問題的原因,但可以取決於您如何使用課程。 – diidu
嘗試使構造函數私人並檢查 –