在本文中,我们将详细介绍在onDestroy中执行长时间运行的操作的各个方面,同时,我们也将为您带来关于.net–如何从长时间运行的PostgreSQL函数报告进程到客户端、android–在onDe
在本文中,我们将详细介绍在onDestroy中执行长时间运行的操作的各个方面,同时,我们也将为您带来关于.net – 如何从长时间运行的PostgreSQL函数报告进程到客户端、android – 在onDestroy()之后仍然运行的IntentService onHandleIntent()、android – 对服务执行长时间运行的操作、android – 应该或不应该将AsyncTask用于长时间运行的操作?的有用知识。
本文目录一览:- 在onDestroy中执行长时间运行的操作
- .net – 如何从长时间运行的PostgreSQL函数报告进程到客户端
- android – 在onDestroy()之后仍然运行的IntentService onHandleIntent()
- android – 对服务执行长时间运行的操作
- android – 应该或不应该将AsyncTask用于长时间运行的操作?
在onDestroy中执行长时间运行的操作
我有一个“长期运行的”清理行动,我需要执行onDestroy()
我的Activity
。做这个的最好方式是什么?
如果我使用aThread
这样做,我onDestroy()
将立即返回;但是线程引用发生了什么?我正在寻找有关此处需要了解的任何影响/陷阱/绊网的建议,因为我认为即使活动被销毁,该流程仍将继续存在。
背景:
我在我的应用程序中使用JmDNS。当用户使用完我的应用程序后,我想清理JmDNS实例。我使用类close()
方法进行此操作JmDNS
。但是,此方法需要
5秒钟以上 才能完成。结果,用户Activity
在触摸“返回”键后在很长一段时间内看到了我的屏幕。
我还没有弄清楚为什么close()
花那么长的时间,但是与此同时,我也意识到我真的不需要等待收盘成功完成。我需要的是一种“触发”关闭并完成操作的方法。
答案1
小编典典我最终完成了我在问题中提出的要求-我开始在Thread
中执行长期运行的操作onDestroy()
。
我必须考虑的一种情况是,即使在长时间运行之前,用户仍重新打开我的应用程序。在我的应用程序中,这意味着将创建一个新的JmDNS实例。因此,我分别在中清理每个实例onDestroy
。
您的用例可能有所不同-您可能只想在清理线程尚未运行时启动它(使用Thread
的isAlive()
方法或某种类似的技术)。
这是一些示例代码。要欣赏“分别清理每个实例”部分,请执行以下步骤序列:
- 启动应用
- 按下返回按钮。您将在LogCat中看到清理操作
- 重新启动应用程序。
- 再次退出应用程序。现在,您将看到两组清理日志-第一个代表第一个实例的清理;第二个代表第一个实例的清理。第二集合对应于第二实例。
public class DelayedExitActivity extends Activity {private static final String LOG_TAG = "DelayedExit";private final Runnable longOperation = new Runnable(){ @Override public void run() { for (int i=0 ; i < 50; i++){ Log.d(LOG_TAG, "Iteration "+i); try { Thread.sleep(2 * 1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }};private Thread longThread ;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);}@Overrideprotected void onDestroy() { if(longThread == null){ longThread = new Thread(longOperation); } longThread.start(); super.onDestroy();}
}
.net – 如何从长时间运行的PostgreSQL函数报告进程到客户端
听到/ NOTIFY机制听起来是完美的,除了整个事情在一个事务中运行,NOTIFY事件不会发送到交易结束,这对我没用.
我尝试过的另一件事是RAISE NOTICE,我可以在客户端上处理,但即使这些通知似乎被缓冲了一段时间,并分批发送.没有什么好,但不是理想.有什么办法可以“冲洗”他们,所以立即被发送给客户?
这些信号不是缓冲的 – 它们是异步的 – 你可能在应用程序的处理通知中有问题.
android – 在onDestroy()之后仍然运行的IntentService onHandleIntent()
public class Setting extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); downloadPref.setonPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference pref) { if (DownloadService.isRunning) { Setting.this.stopService(new Intent(Setting.this,DownloadService.class)); } else { Setting.this.startService(new Intent(Setting.this,DownloadService.class)); } return false; } }); } }
服务类:
public class DownloadService extends IntentService { public static final int DOWNLOAD_SUCCESS = 0; public static final int DOWNLOAD_FAIL = 1; public static final int DOWNLOAD_CANCELLED = 2; public static final int SERVER_FAIL = 3; public static boolean isRunning = false; private int result; public DownloadService() { super("DownloadService"); } @Override public void onCreate() { super.onCreate(); isRunning = true; } @Override protected void onHandleIntent(Intent intent) { if (NetworkStateUtils.isInternetConnected(getApplicationContext())) result = downloadFiles(getApplicationContext()); } @Override public void onDestroy() { super.onDestroy(); switch (result) { case DOWNLOAD_SUCCESS: Toast.makeText(getApplicationContext(),R.string.download_finished,Toast.LENGTH_SHORT).show(); break; case DOWNLOAD_CANCELLED: Toast.makeText(getApplicationContext(),R.string.download_canceled,Toast.LENGTH_SHORT).show(); break; case DOWNLOAD_FAIL: Toast.makeText(getApplicationContext(),R.string.download_Failed,Toast.LENGTH_SHORT).show(); break; } isRunning = false; } }
此服务将在下载完成之前运行.函数downloadFiles()不使用AsyncTask.它直接使用FileOutputStream保存HttpURLConnection.
单击首选项时,服务正确启动.现在的问题是,当我点击停止服务时使用stopService(),DownloadService立即触发了onDestroy();但是根据日志,onHandleIntent()仍在运行,因为我仍然可以连续看到HTTP请求.这是因为Service本身在一个线程中运行,还是我做错了什么?当调用stopService()时,如何确保onHandleIntent()中的所有内容立即停止(或至少能够停止)?
解决方法
正如我在我的问题中所述,onHandleIntent()不知何故会创建一个线程来完成这项工作.因此,即使服务本身被破坏,该线程仍在运行.我通过添加全局变量实现了我的目标
private static boolean isstopped = false;
到DownloadService类.
为了取消我的服务,而不是打电话
Setting.this.stopService(new Intent(Setting.this,DownloadService.class));
只需设置DownloadService.isstopped = true.
最后,在onHandleIntent()中执行操作时,请定期检查此布尔值以查看是否应该停止下载.如果isstopped = true,则立即返回,服务将自行停止.
希望这也有助于遇到这个问题的人.感谢您抽出时间阅读这个问题.
android – 对服务执行长时间运行的操作
我正在构建一个具有服务的应用程序.我知道所有应用程序组件都在同一个UI进程中运行,至少你在清单中指定它.所以为了避免ANR的消息,我有三种方法.
>在清单中指定服务以在单独的进程中运行
android:process =“:remote”但是我已经阅读了一些StackOverflow的帖子
说它不是一个好主意,因为它消耗了大量的电池和cpu处理.
我真的很尊重,因为那些帖子来自可信赖的人.
>使用IntentService.这可能是一个很好的出路.但我需要我的服务运行即使
活动不可见.因为我需要服务不断检查新服务的Web服务
来自其他用户的消息并通知通知.是否可以使用
一个IntentService?这是一个优雅的解决方案.
>使用本地服务.只是从清单文件中删除android:process =“:remote”属性.
但我得到一些…… OnMainThreadException错误.这意味着我需要创建一个特殊的
线程执行那些长时间运行的操作或使用AsyncTask,
也许有另一种方法可以做到这一点.请告诉我,如何对服务执行长期运行操作.真的很有必要.
谢谢.
解决方法:
首先,我们接受有两个部分:活动部分(网络)和下一个活动部分之前的一些睡眠部分.我认为您可以使用普通的本地IntentService来处理活动部件.完成后,每个活动部件都应使用AlarmManager重新安排下一个活动部件.这种方法可确保您的应用在睡眠部分时不会消耗资源.你是对的 – 一旦IntentService得到一个结果呈现给用户,它就可以使用Notification.
android – 应该或不应该将AsyncTask用于长时间运行的操作?
我对AsyncTask的内容感到困惑.一方面,android文档声明了 “AsyncTasks should ideally be used for short operations (a few seconds at the most.)”.该文档没有解释为什么会这样.
另一方面,我读过至少一篇明确或暗示暗示AsyncTasks用于长时间运行的文章,例如one.
任何Android大师能否给出一个更有说服力的理由为什么或为什么不将AsyncTask用于长时间运行?或者指出解释这一点的文件.我一直无法找到答案.
啊,别人问similar question.让我看看答案是否对我有意义.
解决方法
如果您需要正在进行的后台线程,请使用Executor执行承载正在进行的操作的Runnable实例.但请谨慎使用,因为当您的应用程序离开前台时,该线程将继续运行.仔细制作你的Runnable,使其可以中止(可以使run()方法干净地返回).
值得注意的是,AsyncTask只会强制您进入一个定义良好的模式,以执行异步操作,然后更新UI.恕我直言,它过于复杂,并做了很多假设,如单个或有限大小的线程池.例如,如果您的应用程序的某个部分在AsyncTasks中阻塞,您会认为它会阻止AsyncTask在您的应用程序的另一部分中运行吗?它会.
关于在onDestroy中执行长时间运行的操作的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于.net – 如何从长时间运行的PostgreSQL函数报告进程到客户端、android – 在onDestroy()之后仍然运行的IntentService onHandleIntent()、android – 对服务执行长时间运行的操作、android – 应该或不应该将AsyncTask用于长时间运行的操作?等相关内容,可以在本站寻找。
本文标签: