我目前正在开发一款Android应用,但我遇到了以下问题:每次关闭应用或崩溃时,几秒钟后,它会再次打开,全部自动完成。
我已经缩小了PlanItApp类的问题,它继承自Application。所有登录过程都在该类中完成,当它完成时,我从同一个类中调用de Main活动。这是令人不安的部分(这是一个内部类在PlanItApp内部,它用于从服务器检索数据):
public class BaseAsyncDataRetriever extends AsyncTask<PlanItApp, Void, Void>
{
@Override
protected Void doInBackground(PlanItApp... params) {
setContacts();
PlanItApp app = params[0];
final CountDownLatch latch = new CountDownLatch(1);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
invitedEventsAux = toLinkedList(PlanItApp.client.getUserInvitedEvents(PlanItApp.PIiD));
latch.countDown();
}
});
});
t1.start();
try {latch.await();
} catch (InterruptedException e) {e.printStackTrace();}
return null;
}
@Override
protected void onPostExecute() {
super.onPostExecute();
Intent i = new Intent(getApplicationContext(), Main.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
}
而且,如果我注释掉 startActivity(i); 该应用程序不会自行打开。即使调用onPostExecute()并打开Main活动,如果我之后关闭应用程序,它将在几秒钟后自行打开。
由于我完全不知道问题可能是什么,我不知道其他一些代码可能是相关的。任何见解都可能有用。
答案 0 :(得分:3)
完成doInBackground
的执行,然后进入最终调用onPostExecute
的{{1}}。关闭应用程序并不会改变任何内容,一旦后台线程完成,startActivity
会自动被调用。
在我的脑海中,尝试保留一个全局布尔值以便在onPostExecute
中成功运行,并且只有在它设置的情况下才调用startActivity,当然必须在doInBackground
或onPause()
中取消设置{1}}。
但可能有更好的解决方案。
更新:你真的需要新的线程吗?您知道,onStop()
会自动为您创建一个新的AsyncTask
,因此您在Thread
中所做的一切都已经在该主题上。
如果您需要在doInBackground()
内设置新的Thread
,正确的方法是等待它完成并为该线程调用doInBackground()
。
以下是example
答案 1 :(得分:0)
我终于找到了解决方案。问题是,在PlanIt类的onCreate()方法中,我调用了异步类,最终将启动Main活动。问题是,当应用程序关闭时,操作系统将重新打开它(这发生在每个其他进程中)并再次调用onCreate()方法,然后重新打开应用程序。这就是为什么有一个启动器类的原因。
解决方案是将活动实例化逻辑移动到启动器类,只有在用户打开它时,每次关闭应用程序时都不会调用它。