質問

I have problem with asynctasks blocking UI when task download metafile from FTP server.

[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;
    }

In fact I use TaskConnect to connect to the FTP Server this task not freeze UI.

役に立ちましたか?

解決

You are calling AsyncTask's get() which blocks the calling Thread until it finishes. Remove the get() calls.

他のヒント

Instead of using get() method of AsyncTask, you may wait that task finish in doInBackground() method then add the code you want to execute in onPostExecute().

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top