设置导致性能问题的int值

时间:2016-11-02 05:06:47

标签: java android multithreading memory int

前置背景:我使用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()之后)。

2 个答案:

答案 0 :(得分:1)

我认为这是因为list指向一些实际上并不直接存在于应用程序内存中的虚拟结构。

因此,要么涉及某个远程调用,需要至少获取列表的大小,或者甚至更糟,它要求其他(远程)应用程序中的完整列表,并序列化/反序列化完整的项目列表。由于这一点和延迟,它会显着延迟您的原始应用程序。

您可以调试内部真正发生的事情,或至少检查类的类型以提供提示。

答案 1 :(得分:0)

将此代码应用于您的gradle文件中: -

android {
    dexOptions {
        javaMaxHeapSize "4g"
    }
}

我希望这会对你有所帮助。