我的应用程序执行以下操作:AsyncTask服务无法访问
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
未被正确读取。我检查了变量,值是确定的,但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
}
};
再次,一切正常,直到我从服务断开连接。为什么我只能在不断开服务的情况下控制线程?
这里是我开始/服务绑定到活性2(只有他们重要的部分)的代码:
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
}
};
当我尝试达到服务的其他部分(设置变量或类似的东西),一切工作正常。
这是关于状态变量的范围。您是否尝试将其设置为静态以查看该服务如何处理它。 – Steve 2010-02-20 18:29:18
嘿史蒂夫,那可能,我不知道。我的应用程序是这样构造的:Activity2 - > Service(这里我定义变量) - > AsyncTask。就像我说的,一切正常,直到我断开服务。如果您需要更多代码,请告诉我。 – Andy 2010-02-21 13:44:05
嘿,它再次。我对主帖进行了编辑,请再看一遍。谢谢。 – Andy 2010-02-22 15:06:43