前置背景:我使用Firebase进行数据库存储,对于那些不了解其工作原理的人:何时存储/删除/修改对象Firebase(无论是String,int等),Firebase会向正在收听所有新信息的移动设备发送更新的信息包。问题是Firebase不会仅发送存储的新对象,而是再次发送该节点中的所有内容。
背景:为了找出是否有什么内容添加到Firebase,我决定制作两个int变量。一个名为" oldCount"一个名为" newCount"。它们都被设置为0 onCreate()。每次Firebase都发送了一个新的更新数据包(" onDataChange")我做了以下事情:
oldCount = currentCount;
currentCount = list.size();
"列表"是我根据Firebase发送的信息创建的arraylist。如果currentCount> oldCount则添加了数据,我可以继续使用我的代码。
问题:添加这两行后,我的内存使用量增加了,我的设备和Firebase之间的延迟增加了,一个简单的动画我没有工作,我的线程正在跳过〜 200帧。这听起来很荒谬,但删除这两行之后一切正常,记忆正常,没有帧跳过。我打算寻找一种不同的方法来检查是否添加了数据,但我发现这个错误太奇怪了,我希望有人可以了解一下发生了什么。
相关代码:
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
private GoogleMap mMap;
private boolean mapReady = false;
private boolean firstLoad = true;
private int loadCount;
private ArrayList<> list;
private DatabaseReference Reference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
list = new ArrayList<>();
loadCount = 0;
setUpData();
private void setUpData() {
Query query = openTicketsReference.orderByChild("variableX").equalTo("variableY");
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
listOfInspections = new ArrayList<>();
for (DataSnapshot ref : dataSnapshot.getChildren()) {
//get data and add to arraylist here
}
loadCount++; //see how many times data has been retrieved from server
}
setUpMarkers();
}
private void setUpMarkers() {
if(loadCount<2){
Log.v("loadCount<2",""+loadCount);
//do things for first data retrieval
}
else if (loadcount>1){
Log.v("loadCount>1",""+loadCount);
//do things for subsequent retrievals
}
}
}
我最后在这些日志中看到的内容也有点令人困惑:
(这是在向firebase添加数据之后)
V/loadCount>1: 33
V/loadCount>1: 11
V/loadCount>1: 8
V/loadCount>1: 34
V/loadCount>1: 34
V/loadCount>1: 12
V/loadCount>1: 9
V/loadCount>1: 35
V/loadCount>1: 35
V/loadCount>1: 13
V/loadCount>1: 10
V/loadCount>1: 36
V/loadCount>1: 36
V/loadCount>1: 14
V/loadCount>1: 11
它们永远不应该减少,因为我从不从变量中减去,只添加(在将它设置为0 onCreate()之后)。
答案 0 :(得分:1)
我认为这是因为list
指向一些实际上并不直接存在于应用程序内存中的虚拟结构。
因此,要么涉及某个远程调用,需要至少获取列表的大小,或者甚至更糟,它要求其他(远程)应用程序中的完整列表,并序列化/反序列化完整的项目列表。由于这一点和延迟,它会显着延迟您的原始应用程序。
您可以调试内部真正发生的事情,或至少检查类的类型以提供提示。
答案 1 :(得分:0)
将此代码应用于您的gradle文件中: -
android {
dexOptions {
javaMaxHeapSize "4g"
}
}
我希望这会对你有所帮助。