在IntentService中循环

Jas*_*ing 7 android android-intent intentservice

我的IntentService中有一个无限循环,根据主要活动的输入,每30秒更新一次视图.

public class IntentServiceTest extends IntentService {

String Tag = "IntentServiceTest";
String ACTION_RCV_MESSAGE = "com.jsouptest8.intent.action.MESSAGE";

public IntentServiceTest(){
    super("IntentServiceTest");
    Log.d(Tag, "IntentServiceTest constructor");
}

@Override
protected void onHandleIntent(Intent intent) {
    // TODO Auto-generated method stub
    Log.d(Tag, "in onHandleIntent");
    String url = intent.getStringExtra("URL");
    Document doc;
    int i=0;
    try{
      while(true){
         Log.d(Tag, "entered try block...");
         Log.d(Tag, "url = "+url);
         doc = Jsoup.connect(url)
         .get();

       Log.d(Tag, "past Jsoup.connect");
         Element data = doc.select("table").get(1).attr("bgcolor", "#f4f36f");
         Log.d(Tag, data.toString());
         Log.d(Tag, data.text());
         Log.d(Tag, "creating intent...");
         Intent broadcastIntent = new Intent();
         Log.d(Tag, "setting action...");
         broadcastIntent.setAction(ACTION_RCV_MESSAGE);
         broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
         broadcastIntent.putExtra("OUTPUT", data.toString());
         Log.d(Tag, "sending broadcast: "+(i++));
         sendBroadcast(broadcastIntent);
         Thread.sleep(30*1000);
      }
    }
    catch(StackOverflowError e){
        Log.d(Tag, "in StackOverflowError block...");
        Log.d(Tag, "creating intent...");
        Intent broadcastIntent = new Intent();
        Log.d(Tag, "setting action...");
        broadcastIntent.setAction(ACTION_RCV_MESSAGE);
        broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
        broadcastIntent.putExtra("OUTPUT", "?????, ?????");
        Log.d(Tag, "sending broadcast...");
        sendBroadcast(broadcastIntent);
    }
    catch(Exception e){
        Log.d(Tag, "in catch Exception block...");   
        onHandleIntent(intent);
    }
}

}
Run Code Online (Sandbox Code Playgroud)

问题是,我陷入了这个循环.即使我终止主活动然后返回它以输入新输入,并且IntentService仍然基于旧输入返回.

我需要知道如何每隔30秒从URL更新自己而不会卡住.谢谢!

Ash*_*win 6

An IntentService意味着完成一项任务并返回.它在一个新线程中执行此任务.不要在IntentService中使用while循环.IntentService一段时间后你的意志会被杀死.我是根据个人经验告诉我的.我尝试在其中使用while循环.在while循环结束时,我使用了sleep(60000)1分钟.但是我发现我的IntentService在一段时间后被杀了.

我建议你不要使用AlarmManager 30秒,因为有些人已经消失了.因为30秒太短了.它会耗尽电池.对于AlarmManager,使用至少1分钟的RTC.

如果您仍希望它为30秒,请使用服务.在服务中使用你的逻辑.但是在单独的线程中执行此操作即在您的服务中生成一个新线程并在其中使用while循环sleep().并且不要忘记使用startForeGround.这大大降低了Android杀死您服务的可能性.


Hos*_*laa 1

在此链接中,您将找到一项使用计时器进行自我更新的服务

保持服务运行

如果您熟悉 while 循环,只需编写一个存在循环的 if 语句

if(thisIsTrue)
 {
   break; // this will exit the loop!
 }
Run Code Online (Sandbox Code Playgroud)