GVKun编程网logo

在onDestroy中执行长时间运行的操作

17

在本文中,我们将详细介绍在onDestroy中执行长时间运行的操作的各个方面,同时,我们也将为您带来关于.net–如何从长时间运行的PostgreSQL函数报告进程到客户端、android–在onDe

在本文中,我们将详细介绍在onDestroy中执行长时间运行的操作的各个方面,同时,我们也将为您带来关于.net – 如何从长时间运行的PostgreSQL函数报告进程到客户端、android – 在onDestroy()之后仍然运行的IntentService onHandleIntent()、android – 对服务执行长时间运行的操作、android – 应该或不应该将AsyncTask用于长时间运行的操作?的有用知识。

本文目录一览:

在onDestroy中执行长时间运行的操作

在onDestroy中执行长时间运行的操作

我有一个“长期运行的”清理行动,我需要执行onDestroy()我的Activity。做这个的最好方式是什么?

如果我使用a
Thread这样做,我onDestroy()将立即返回;但是线程引用发生了什么?我正在寻找有关此处需要了解的任何影响/陷阱/绊网的建议,因为我认为即使活动被销毁,该流程仍将继续存在。


背景:

我在我的应用程序中使用JmDNS。当用户使用完我的应用程序后,我想清理JmDNS实例。我使用类close()方法进行此操作JmDNS。但是,此方法需要
5秒钟以上 才能完成。结果,用户Activity在触摸“返回”键后在很长一段时间内看到了我的屏幕。

我还没有弄清楚为什么close()花那么长的时间,但是与此同时,我也意识到我真的不需要等待收盘成功完成。我需要的是一种“触发”关闭并完成操作的方法。

答案1

小编典典

我最终完成了我在问题中提出的要求-我开始在Thread中执行长期运行的操作onDestroy()

我必须考虑的一种情况是,即使在长时间运行之前,用户仍重新打开我的应用程序。在我的应用程序中,这意味着将创建一个新的JmDNS实例。因此,我分别在中清理每个实例onDestroy

您的用例可能有所不同-您可能只想在清理线程尚未运行时启动它(使用ThreadisAlive()方法或某种类似的技术)。

这是一些示例代码。要欣赏“分别清理每个实例”部分,请执行以下步骤序列:

  1. 启动应用
  2. 按下返回按钮。您将在LogCat中看到清理操作
  3. 重新启动应用程序。
  4. 再次退出应用程序。现在,您将看到两组清理日志-第一个代表第一个实例的清理;第二个代表第一个实例的清理。第二集合对应于第二实例。
    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函数报告进程到客户端

.net – 如何从长时间运行的PostgreSQL函数报告进程到客户端

我有一个C#客户端应用程序,使用Npgsql在Postgresql 9.1.4中调用一个plpgsql函数.该功能需要很长时间,我想以某种方式向客户报告进度.我该怎么办?

听到/ NOTIFY机制听起来是完美的,除了整个事情在一个事务中运行,NOTIFY事件不会发送到交易结束,这对我没用.

我尝试过的另一件事是RAISE NOTICE,我可以在客户端上处理,但即使这些通知似乎被缓冲了一段时间,并分批发送.没有什么好,但不是理想.有什么办法可以“冲洗”他们,所以立即被发送给客户?

没有比RAISE通知更好的.

这些信号不是缓冲的 – 它们是异步的 – 你可能在应用程序的处理通知中有问题.

android – 在onDestroy()之后仍然运行的IntentService onHandleIntent()

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 – 对服务执行长时间运行的操作

android – 对服务执行长时间运行的操作

我正在构建一个具有服务的应用程序.我知道所有应用程序组件都在同一个UI进程中运行,至少你在清单中指定它.所以为了避免ANR的消息,我有三种方法.

>在清单中指定服务以在单独的进程中运行
 android:process =“:remote”但是我已经阅读了一些StackOverflow的帖子
 说它不是一个好主意,因为它消耗了大量的电池和cpu处理.
 我真的很尊重,因为那些帖子来自可信赖的人.
>使用IntentService.这可能是一个很好的出路.但我需要我的服务运行即使
 活动不可见.因为我需要服务不断检查新服务的Web服务
 来自其他用户的消息并通知通知.是否可以使用
 一个IntentService?这是一个优雅的解决方案.
>使用本地服务.只是从清单文件中删除android:process =“:remote”属性.
 但我得到一些…… OnMainThreadException错误.这意味着我需要创建一个特殊的
 线程执行那些长时间运行的操作或使用AsyncTask,

也许有另一种方法可以做到这一点.请告诉我,如何对服务执行长期运行操作.真的很有必要.

谢谢.

解决方法:

首先,我们接受有两个部分:活动部分(网络)和下一个活动部分之前的一些睡眠部分.我认为您可以使用普通的本地IntentService来处理活动部件.完成后,每个活动部件都应使用AlarmManager重新安排下一个活动部件.这种方法可确保您的应用在睡眠部分时不会消耗资源.你是对的 – 一旦IntentService得到一个结果呈现给用户,它就可以使用Notification.

android – 应该或不应该将AsyncTask用于长时间运行的操作?

android – 应该或不应该将AsyncTask用于长时间运行的操作?

参见英文答案 > Android AsyncTask for Long Running Operations                                    4个
我对AsyncTask的内容感到困惑.一方面,android文档声明了 “AsyncTasks should ideally be used for short operations (a few seconds at the most.)”.该文档没有解释为什么会这样.

另一方面,我读过至少一篇明确或暗示暗示AsyncTasks用于长时间运行的文章,例如one.

任何Android大师能否给出一个更有说服力的理由为什么或为什么不将AsyncTask用于长时间运行?或者指出解释这一点的文件.我一直无法找到答案.

啊,别人问similar question.让我看看答案是否对我有意义.

解决方法

AsyncTask公开的接口定义了一个设置,一个后台操作,以及一个可以更新UI的“on done”回调.这意味着它的预期用途是用于具有明确定义的结束的操作,从而产生对用户的反馈.

如果您需要正在进行的后台线程,请使用Executor执行承载正在进行的操作的Runnable实例.但请谨慎使用,因为当您的应用程序离开前台时,该线程将继续运行.仔细制作你的Runnable,使其可以中止(可以使run()方法干净地返回).

值得注意的是,AsyncTask只会强制您进入一个定义良好的模式,以执行异步操作,然后更新UI.恕我直言,它过于复杂,并做了很多假设,如单个或有限大小的线程池.例如,如果您的应用程序的某个部分在AsyncTasks中阻塞,您会认为它会阻止AsyncTask在您的应用程序的另一部分中运行吗?它会.

关于在onDestroy中执行长时间运行的操作的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于.net – 如何从长时间运行的PostgreSQL函数报告进程到客户端、android – 在onDestroy()之后仍然运行的IntentService onHandleIntent()、android – 对服务执行长时间运行的操作、android – 应该或不应该将AsyncTask用于长时间运行的操作?等相关内容,可以在本站寻找。

本文标签: