我的应用执行以下操作:
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
}
};
当我尝试访问服务的其他部分(设置变量或类似的东西)时,一切正常。