2013-11-11 3 views
0

Я делаю приложение, которое требует постоянного выполнения запросов определенного атрибута в table.Here, как я делаю это прямо сейчас .. код из моего класса обслуживания:служба в бесконечном цикле - андроид

@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

Вы не можете показать сообщение Toast в сервисе, код должен показывать ошибку. –

+0

nope это прекрасно работает .. – parth

+1

@Brontok http://developer.android.com/reference/android/app/Service.html. тост в обслуживании прекрасен. – Raghunandan

ответ

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."); 
       } 
      } 
     }); 
    } 
} 
+0

Я сделал это, и приложение перестает отвечать во время выполнения – parth

0

Похоже, вы получаете ваш потоковая перепутаны. Ваш код пытается запустить этот фоновый процесс, а затем снова и снова возвращать START_STICKY.
Даже если вам не нужно было что-то возвращать, ваши процессы будут пытаться работать одновременно.

Хитростью было бы позвонить query.findInBackground() из метода done()FindCallBack, возможно, с некоторым подходящим временем задержки между запросами.
Таким образом, вы запускаете один, а затем, когда он закончен, вы начинаете следующий.
Это устранит весь цикл while и упростит просто запуск первого фонового запроса, а затем вернется START_STICKY

Смежные вопросы