预备背景:我正在使用 Firebase 进行数据库存储,对于那些不知道其工作原理的人:当在 Firebase 中存储/删除/修改对象时(无论是是字符串、整数等),Firebase 会向正在监听所有新信息的移动设备发送更新的信息包。问题是 Firebase 不仅仅发送存储的新对象,它还会再次发送该节点中的所有内容。
背景:为了查明 Firebase 中是否添加了某些内容,我决定创建两个 int 变量。一种称为“oldCount”,一种称为“newCount”。它们都在 onCreate() 中设置为 0。每次 Firebase 发送新的更新数据包(“onDataChange”)时,我都会执行以下操作:
oldCount = currentCount;
currentCount = list.size();
“list”是我根据 Firebase 发送的信息创建的数组列表。如果 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
它们永远不应该减少,因为我从不从变量中减去,只添加(在 onCreate() 将其设置为 0 之后)。
最佳答案
我认为这是因为 list
指向某个虚拟结构,而该结构实际上并不直接位于应用程序的内存中。
因此,要么涉及一些远程调用,它至少需要获取列表的大小,或者甚至更糟糕,它要求其他(远程)应用程序中的完整列表,并序列化/反序列化项目的完整列表。由于这一点和延迟,它会显着延迟您的原始应用程序。
您可能可以调试内部实际发生的情况,或者至少检查类的类型以给出提示。
关于java - 设置 int 值会导致性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40372850/