【问题标题】:AsynchTask should not stop when I terminates Application当我终止应用程序时,异步任务不应停止
【发布时间】:2014-07-22 08:21:35
【问题描述】:

我正在像这样在Service 内制作 AsynkTask

public class MyService extends Service {

private final IBinder mBinder = new LocalBinder();

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.v("log_tag", "Service started");
    ReceiveAsyncTask receiveATask = new ReceiveAsyncTask();
    receiveATask.execute();
    return super.onStartCommand(intent, flags, startId);
}

@Override
public IBinder onBind(Intent intent) {
    Log.v("log_tag", "onBind");
    return mBinder;
}

public class LocalBinder extends Binder {
    MyService getService() {

        return MyService.this;
    }
}

class ReceiveAsyncTask extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        taskDummy();
        return null;
    }

    @Override
    protected void onPreExecute() {
        Log.v("log_tag", "onPreExecute");
        super.onPreExecute();

    }

    @Override
    protected void onPostExecute(String result) {
        Log.v("log_tag", "onPostExecute");
        super.onPostExecute(result);
    }

    @Override
    protected void onCancelled() {
        Log.v("log_tag", "onPostExecute");
        super.onCancelled();
    }

}

private void taskDummy() {
    while (true) {

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Log.v("log_tag", "taskDummy");
    }
}

/** method for clients */
public int getRandomNumber() {
    Log.v("log_tag", "inner Method called");
    return 100;
}

}

当我运行应用程序时,它开始按预期每两秒打印一次“taskDummy”,当我通过 prsing Back buttin 关闭应用程序时,日志打印仍按预期继续,但是当我从最近的应用程序堆栈中删除应用程序时,它停止打印这不应该发生我希望我的异步任务在这种情况下继续。甚至我可以看到我的服务正在从设置中运行。请给我建议。

【问题讨论】:

  • while (true) { 怎么会被终止?
  • 尝试通过 onStartCommand 将 doInBackgroud 代码放入服务中,而不是使用异步任务
  • @blackbelt 是的,我不想终止。
  • @vipul mittal 我正在做网络操作,所以我正在使用异步任务
  • @jignesh 您也可以在服务内部进行。在活动的情况下,您无法在 UI 线程上执行网络操作,但服务本身是不同的线程。我相信直接进行网络操作是服务没问题的。

标签: android android-asynctask android-service


【解决方案1】:

您需要在您的活动的onDestroy 中显式调用asyncTaskObject.cancel(true);(或您想要的任何活动。)

然后重写你的 while 循环逻辑,类似这样:

 // Create this variable is Your Asyantask class.
 private boolean isRunning = true;

 @Override
 protected void onCancelled() {
        isRunning = false;
 }



@Override
protected String doInBackground(Void... params) {

    while (isRunning ) {

     // Your processing 

    }

    return null;
}

【讨论】:

    【解决方案2】:

    这是一个已知的错误:从最近的应用程序中删除服务会破坏它
    尝试关注solution

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      相关资源
      最近更新 更多