У меня проблема с asynctasks блокировкой пользовательского интерфейса при загрузке метафайла задачи с FTP-сервера.AsyncTask на ftp-проекте
[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.
Я использую Task для подключения и его не заблокированный пользовательский интерфейс, как получить информацию, когда работа выполнена? – Nerus
'get()' будет блокировать вызывающий 'Thread'. То, что вы хотите сделать, это вызвать 'execute()', выполнить длинную задачу в 'doInBackground()' и вернуть значение, которое будет передано 'onPostExecute()', чтобы вы могли обновить пользовательский интерфейс 'Thread' – Emmanuel
@Nerus информация, когда работа выполнена, может быть получена в 'onPostExecute()' метод asynctask, посмотрите на мой ответ. –