我正在创建一个小应用,其中应用的每个所有者都可以点按一个按钮并将屏幕上的数字增加一个。我们的想法是每个应用程序都已连接,每个用户都可以看到相同的号码,以便在所有设备上进行更新。我决定使用Parse SDK在线存储号码,以便在所有设备上访问。我有一个简单的按钮,按下时使用以下代码:
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
query.getInBackground("SQrRpfRBZW",
new GetCallback<ParseObject>() {
@Override
public void done(ParseObject num, ParseException e) {
if (e == null) {
taps.setText(String.valueOf(num
.getInt("Num") + 1));
count = num.getInt("Num");
num.put("Num", count + 1);
num.saveInBackground();
} else {
// ERROR
}
}
});
return false;
}
});
然后,我有一个runnable,它应该获得每500ms在线存储的当前值并在屏幕上更新它:
// RUNNABLE FOR UPDATES
handler = new Handler();
final Runnable r = new Runnable() {
public void run() {
query.getInBackground("SQrRpfRBZW",
new GetCallback<ParseObject>() {
@Override
public void done(ParseObject num, ParseException e) {
if (e == null) {
taps.setText(String.valueOf(num
.getInt("Num")));
} else {
// ERROR
}
}
});
handler.postDelayed(this, 200);
}
};
handler.postDelayed(r, 100);
}
当我运行应用程序时,按下按钮时数字会更新,但速度非常慢,垃圾收集器正在做很多工作。
使用Parse可以更快速地更快速地发送和检索数据吗?关于垃圾收集器我做错了什么?我不认为我会创建许多新的对象。
非常感谢你的时间。
答案 0 :(得分:1)
垃圾收集问题可能来自于您每200毫秒创建一个新的可运行对象,然后将其放在android消息队列中。
我认为在更新号码时更有效地通知用户的方法是强制服务器推送通知而不是让电话查询服务器。您应该使用GCM。 Parse甚至具备内置的能力。
我认为最终,您应该创建一个解析云功能,每次用户按下按钮时都会调用该功能,并且在该云功能中,您会向所有其他用户下推通知,告知该号码已更新且需要查询服务器。
答案 1 :(得分:1)
每次调用新的Runnable或新的Handler或新的GetCallback时,您都会创建一个新的Object。更好的方法是在活动或片段的onCreate中创建所有回调ONCE,并一遍又一遍地重复使用它们。
因此您的代码看起来像
private Runnable mRunnable;
@Override
public void onCreate(Bundle mBundle)
{
super.onCreate(mBundle);
mRunnable = new Runnable() {
public void run() {...}};
//create all of your callbacks here and reuse them
}
当你准备好使用那个runnable时,你会做
handler.postDelayed(mRunnable, 100);
您永远不想在onCreate之外创建对象。对象内存分配和创建是一项昂贵的操作。