服务中无法访问AsyncTask

时间:2010-02-20 18:27:01

标签: android

我的应用执行以下操作:

Activity1启动Activity2 Acitivity2启动服务 该服务使用AsyncTask下载文件。

在AsyncTask中,我有一段这样的代码:

while ((status == 0)) {

            byte buffer[];
            if (size - downloaded > MAX_BUFFER_SIZE) {
                buffer = new byte[MAX_BUFFER_SIZE];
            } else {
                buffer = new byte[size - downloaded];
            }

            int read = stream.read(buffer);
            if (read == -1)
                break;

            file.write(buffer, 0, read);
            downloaded += read;

  }

一切都像预期一样有效。使用status变量,我可以根据其值启动和停止下载。

但是,当我关闭Activity2并再次启动它(服务继续运行)时,我无法停止下载,这意味着无法正确读取变量status。我检查了变量,值是OK但是Asynctask不能识别它。

如何恢复对AsyncTask的控制?

我做了一些更多的测试,但这次是一个线程,以确保它不是我如何处理AsyncTask的失败。我是这样做的:

Activity2启动服务(我这里没有更改任何代码)。 服务创建一个Download对象,使用线程下载文件。

结构如下:

in the Service
private Download dl = new Download();

private final DMInterface.Stub mBinder = new DMInterface.Stub() {

    public void downloadFile() throws DeadObjectException {
        try {
            dl.start(url) // This starts a thread and the download

        } catch (IndexOutOfBoundsException e) {
            Log.e(getString(R.string.app_name), e.getMessage());
        }
    }

    public void stop() throws DeadObjectException {
        dl.cancel(); //This stops the download
    }

};

同样,一切正常,直到我断开服务。为什么我不能在断开服务时控制线程?

以下是我将服务启动/绑定到Activity2的代码(只有它们的重要部分):

public class Activity2 extends ListActivity {

  private DMInterface dmInterface;

  public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.bindService(new Intent(Activity2.this, DMService.class), mConnection, Context.BIND_AUTO_CREATE);
  }

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            dmInterface = DMInterface.Stub.asInterface(service);
            //do some stuff

        }

        public void onServiceDisconnected(ComponentName className) {
            dmInterface = null;
        }
    };
}

有两种情况。在第一个我没有得到第二个错误(但没有其他事情发生)。 当引发错误取决于,我在哪里初始化线程,例如启动线程的对象。

场景1:

当我如上所述这样做时,我没有得到任何错误但没有任何反应。

场景2:

在服务中:

private Download dl;

private final DMInterface.Stub mBinder = new DMInterface.Stub() {

    public void downloadFile() throws DeadObjectException {
        try {
            dl = new Download();
            dl.start(url) // This starts a thread and the download

        } catch (IndexOutOfBoundsException e) {
            Log.e(getString(R.string.app_name), e.getMessage());
        }
    }

    public void stop() throws DeadObjectException {
        dl.cancel(); //This stops the download
    }

};

当我尝试访问服务的其他部分(设置变量或类似的东西)时,一切正常。

1 个答案:

答案 0 :(得分:1)

A Service生活在自己的世界里,作为一种服务,它远离你的程序的其余部分。 Binder可用于与您的服务进行通信。使用setStatus方法定义aidl接口允许您将状态传达给服务。