我试图在AsyncTask中多次更新UI。 首先,UI应该更新,如果请求被接受,之后它应该运行publishProgress,但是如果我在requestAccepted方法中返回一个值,则其他的acceptedFiles方法将永远不会被执行,但我希望它能够执行并更新UI在此任务之前
@Override
protected Void doInBackground(FileInformationHandler... params) {
try {
handler.createSecureSocket("192.168.3.29", 7431);
ProtocolHandler phandler = new ProtocolHandler(handler.getInputStream(), handler.getOutputStream());
phandler.sendInitialisation();
ConfirmationHandler cHandler = new ConfirmationHandler(handler.getInputStream(), handler.getOutputStream());
cHandler.addListener(new ConfirmationReceivedListener() {
@Override
public void requestAccepted(boolean b) {
// Update UI without stopping the asynctask
}
@Override
public void acceptedFiles(int[] ints) {
fileSender.addListener(new ProcessListener() {
@Override
public void processChanged(int i, long l) {
publishProgress(i);
}
});
}
});
} catch (IOException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
答案 0 :(得分:0)
首先,如果您在单独的线程中执行长时间运行操作并且具有针对不同状态的回调,则不需要使用Async任务。
所以在你的情况下,为什么你不能简单地在主线程和回调中所有这些只是更新UI。
但是如果您仍然想要使用Async任务,那么由于doInBackground
在一个单独的线程中执行,您可以按顺序执行该方法中的任何长时间运行操作,并继续使用publishProgress
方法随时更新UI。因为你在你的情况下使用回调接口,方法将返回null
并且控件进入'onPostExecute'。
在doInBackground
方法中使用回调接口的IMO不是正确的方法,并且无法实现asyncTask异步任务的目的。