簡體   English   中英

無限循環中的服務-Android

[英]Service in infinite loop - android

我正在制作一個需要對表中的某個屬性進行持續查詢的應用。這是我現在的操作方式。. 服務類中的代碼:

@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語句放入無法訪問的代碼中?

嘗試這個...

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

看起來您正在混淆線程。 您的代碼將嘗試啟動此后台進程,然后反復返回START_STICKY
即使您不必返回任何內容,您的進程也都將嘗試同時運行。

訣竅是從query.findInBackground()done()方法內部調用query.findInBackground() ,也許在FindCallBack查詢之間使用一些合適的延遲項。
這樣,您可以運行一個,然后在完成時啟動下一個。
這將消除整個while循環,從而使啟動第一個后台查詢然后返回START_STICKY變得簡單

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM