IntentService onHandleIntent()的onDestroy后仍在运行()解雇(

2019-09-24 05:05发布

在我的个人偏好屏幕,我想启动一个服务被点击的偏好之一时,从互联网上下载文件。 如果该服务已在运行(下载文件),那么服务应当停止(取消下载)。

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 。 它保存HttpURLConnectionFileOutputStream直接。

该服务正确启动,当我点击偏好。 现在的问题是,当我点击停止与服务stopService() DownloadService引发onDestroy()马上; 然而,根据记录, onHandleIntent()仍在运行becasue我仍然能看到的HTTP请求不断。 这是因为Service运行在一个线程本身,还是我做错了什么? 我怎样才能确保一切onHandleIntent()立即停止(或者至少能停止)时stopService()被调用?

Answer 1:

最后想出了如何使它发挥作用。

正如我在我的问题,不知何故onHandleIntent(陈述)将创建一个线程来完成这项工作。 因此,即使当服务本身destoryed,线程仍在运行。 我加入了一个全局变量来实现我的目标

private static boolean isStopped = false;

DownloadService类。

为了取消而不是调用我的服务,

Setting.this.stopService(new Intent(Setting.this, DownloadService.class));

刚刚成立DownloadService.isStopped = true

最后,虽然在处事onHandleIntent()定期检查这个布尔,看它是否应该停止下载。 如果isStopped = true ,立即返回,该服务将停止本身。

希望这可以帮助别人谁遇到这个问题了。 并感谢您的时间阅读了这个问题。



Answer 2:

它有一个单独的线程做的工作,并根据它在做什么它可能无法立即停止它。 如果阻塞I / O,中断它很可能没有任何效果。



文章来源: IntentService onHandleIntent() still running after onDestroy() fired