我正在创建一个应用程序,需要不断查询表中的某个属性。这就是我现在正在做的事情。 我的服务类代码:
@Override
public int onStartCommand(Intent intent,int flags,int startId)
{
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
ParseUser currentUser = ParseUser.getCurrentUser();
String username = currentUser.getString("username");
ParseQuery<ParseUser> query = ParseUser.getQuery();
query.whereEqualTo("isAttacking", username);
while(true)
{
query.findInBackground(new FindCallback<ParseUser>() {
public void done(List<ParseUser> objects, ParseException e) {
if ((e == null)&(objects.size() != 0))
{
// The query was successful.
ParseUser attacker = objects.get(0);
String attackerName = attacker.getUsername();
Log.i("ambustest",attackerName);
makeToast(attackerName);
} else {
Log.i("fd","Something went wrong.");
}
}
});
return START_STICKY;
}
}
查询在一个无限循环内,但只执行一次。我最好的猜测是它在遇到return语句时会中断。有什么方法可以保持循环运行而不将return语句放入无法访问的代码中?
答案 0 :(得分:0)
试试这个......
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
ParseUser currentUser = ParseUser.getCurrentUser();
String username = currentUser.getString("username");
ParseQuery<ParseUser> query = ParseUser.getQuery();
query.whereEqualTo("isAttacking", username);
findInBackground();
return START_STICKY;
}
private void findInBackground() {
while (true) {
query.findInBackground(new FindCallback<ParseUser>() {
public void done(List<ParseUser> objects, ParseException e) {
if ((e == null) & (objects.size() != 0)) {
// The query was successful.
ParseUser attacker = objects.get(0);
String attackerName = attacker.getUsername();
Log.i("ambustest", attackerName);
makeToast(attackerName);
} else {
Log.i("fd", "Something went wrong.");
}
}
});
}
}
答案 1 :(得分:0)
看起来你的线程混乱了。您的代码尝试启动此后台进程,然后一遍又一遍地返回START_STICKY
。
即使您不必返回某些内容,您的进程也会尝试同时运行。
诀窍是从query.findInBackground()
的{{1}}方法中调用done()
,也许在查询之间有一些合适的延迟期限。
这样你运行一个然后当它完成时你开始下一个。
这将消除整个while循环,从而使得开始第一个背景查询然后返回{{1}变得简单}