Android 安卓解析。更高效地获取数据?
我正在创建一个小应用程序,每个应用程序的所有者都可以点击一个按钮,然后在屏幕上增加一个数字。其理念是,每个应用程序都已连接,每个用户都可以看到相同的号码,以便在所有设备上进行更新。我决定使用Parse SDK在线存储号码,以便在所有设备上访问。我有一个简单的按钮,按下时使用以下代码:Android 安卓解析。更高效地获取数据?,android,parse-platform,Android,Parse Platform,我正在创建一个小应用程序,每个应用程序的所有者都可以点击一个按钮,然后在屏幕上增加一个数字。其理念是,每个应用程序都已连接,每个用户都可以看到相同的号码,以便在所有设备上进行更新。我决定使用Parse SDK在线存储号码,以便在所有设备上访问。我有一个简单的按钮,按下时使用以下代码: button.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(Vie
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,它应该获得每500毫秒在线存储的当前值,并在屏幕上更新它:
// 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更快地发送和检索数据?关于垃圾收集器,我做错了什么?我不认为我创造了很多新的东西
非常感谢您抽出时间。垃圾收集问题可能是因为您每200毫秒创建一个新的可运行对象,然后将其放入android消息队列 我认为当号码更新时通知用户的一种更有效的方法是强制服务器推送通知,而不是让电话查询服务器。您应该为此使用GCM。Parse甚至有内置的功能
我认为最终,您应该创建一个解析云函数,每次用户按下按钮时都会调用该函数,在该云函数中,您会向所有其他用户发送一个通知,告知号码已更新,他们需要查询服务器。每次调用new Runnable或new Handler时,或者新建GetCallback,您正在创建一个新对象。更好的方法是在创建活动或片段时一次性创建所有回调,并反复重用它们 所以你的代码看起来像
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之外创建对象。对象内存分配和创建是一项昂贵的操作。只是澄清一下:可运行对象不是每200ms创建一次,GetCallback对象是:@JorgeGalvão我不知道你的意思。我们知道代码每200ms创建一个匿名runnable和GetCallBack对象。我的理解是,无论何时使用new关键字,都是在创建一个新对象,并在堆上为其分配空间。在java中,当堆栈上的任何变量不再引用该内存分配时,对象被垃圾收集。因此,在这个场景中,如果我的理解是正确的,gc必须不断地为正在创建的runnable和GetCallBack对象释放内存。然后重用它,反复调用它的方法run,但不创建其他可运行实例:handler.postdayedthis,200;