当任务从 FTP 服务器下载元文件时,我遇到了异步任务阻塞 UI 的问题。
[Main.class] FragmentActivity
@Override
public void onClick(View view) {
TestSettings(); // TODO do usunięcia z kodu
String password = this.password.getText().toString();
boolean isConnected = false;
try {
isConnected = new TaskConnect(new ProgressDialog(getActivity().getApplicationContext()), password).execute().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
if (isConnected) {
Toast.makeText(getActivity(), "Connected", Toast.LENGTH_LONG).show();
try {
boolean isListDownloaded = new TaskDownloadFilesList(new ProgressDialog(getActivity().getApplicationContext())).execute().get();
if(isListDownloaded) {
getFragmentManager().beginTransaction()
.replace(R.id.container, new FragmentList(client.getList()))
.addToBackStack(this.getTag())
.commit();
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
[TaskDownloadFilesList.class] - AsyncTask
public class TaskDownloadFilesList extends AsyncTask <Boolean, Boolean, Boolean> {
private static final FTP CLIENT = FTP.getInstance();
private static ProgressDialog dialog = null;
private static boolean isDownloaded = false;
public TaskDownloadFilesList(ProgressDialog dialog) { this.dialog = dialog; }
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.setMessage("Downloading list");
dialog.setCancelable(false);
}
@Override
protected Boolean doInBackground(Boolean... booleans) {
dialog.show();
if(CLIENT.isConnected()) {
try { isDownloaded = CLIENT.checkList(); }
catch (IOException e) { e.printStackTrace(); }
}
return false;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
dialog.dismiss();
}
public boolean getResult() {
return isDownloaded;
}
事实上,我使用 TaskConnect 连接到 FTP 服务器,这个任务不会冻结 UI。