gpt4 book ai didi

android - 在 IntentService 中循环

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:25:52 25 4
gpt4 key购买 nike

我的 IntentService 中有一个无限循环,根据主 Activity 的输入每 30 秒更新一次我的 View 。

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);
}
}

}

问题是,我陷入了这个循环。即使我终止主要 Activity 然后返回到它输入新输入,并且 IntentService 仍然根据旧输入返回。

我需要知道如何每 30 秒从 URL 更新一次而不会卡住。谢谢!

最佳答案

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

我建议您不要像某些人建议的那样在 30 秒内使用 AlarmManager。因为30秒太短了。它会耗尽电池。对于 AlarmManager 使用至少 1 分钟 RTC .

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

关于android - 在 IntentService 中循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12016641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com