java - 设置 int 值会导致性能问题

标签 java android multithreading memory int

预备背景:我正在使用 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/

相关文章:

java - ClassNotFound 带有 Maven WAR 文件

Android 和 iOS 库的行为就像 1996 年之前从未有过夏令时一样

JAVA - Socket.accept() 卡住用户界面

java - 什么是使 Java8 流生成格式化字符串的高效方法

java - 一个entityManager找到entity,另一个没有找到

java - 验证电子邮件地址和密码

android - Android 开发团队的人员使用哪些工具来创建图表和流程图?

android - 即使颁发它的 CA 不可信,网络安全配置文件中固定的公钥是否可信?

java如何重载run()方法

java - Netty客户端多个请求