2014-01-26 6 views
0

У меня проблема с 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.

ответ

1

Вы звоните AsyncTaskget(), который блокирует вызов Thread, пока он не закончит. Удалите вызовы get().

+0

Я использую Task для подключения и его не заблокированный пользовательский интерфейс, как получить информацию, когда работа выполнена? – Nerus

+0

'get()' будет блокировать вызывающий 'Thread'. То, что вы хотите сделать, это вызвать 'execute()', выполнить длинную задачу в 'doInBackground()' и вернуть значение, которое будет передано 'onPostExecute()', чтобы вы могли обновить пользовательский интерфейс 'Thread' – Emmanuel

+0

@Nerus информация, когда работа выполнена, может быть получена в 'onPostExecute()' метод asynctask, посмотрите на мой ответ. –

1

Вместо использование get() метода AsyncTask, вы можете ждать, что закончить задачу в doInBackground() методе затем добавить код, который вы хотите выполнить в onPostExecute().

Смежные вопросы