Question

Je suis en train d'afficher un indicateur de progression lorsque vous faites des demandes de réseau avec le volley.J'obtiens l'erreur "Seul le thread d'origine que de créer une vue de la hiérarchie peut toucher son point de vue".Je ne peux pas comprendre comment obtenir mon hideProgressDialog() sur le même thread que showProgressDialog().Voici mon code...

showProgressDialog("Logging you in");

    String url = ApplicationController.getInstance().getBaseURL() + "Customer/LoginCustomer";

    JsonRequest<String> jr = new JsonRequest<String>(Method.POST, url, jo.toString(), this.createSuccessListener(),
            this.createErrorListener()) {

        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse nr) {
            hideProgressDialog();
            try {
                String str = new String(nr.data, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return null;
        }
    };

    ApplicationController.getInstance().addToRequestQueue(jr);
}

/** Create Volley Listeners **/
private Response.ErrorListener createErrorListener() {
    return new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            hideProgressDialog();
        }
    };
}

private Response.Listener<String> createSuccessListener() {
    return new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            hideProgressDialog();}
    };
}

Solution

Grâce à tautvydas.J'ai fini par mettre ces méthodes dans ma classe de base.

protected void showProgressDialog(String message) {
    if(mHandler == null){
        mHandler = new Handler();
    }
    if (mDialog == null || !mDialog.isShowing()) {
        mDialog = new ProgressDialog(getActivity());
        mDialog.setMessage(message);
        mDialog.setCancelable(false);
        mDialog.setIndeterminate(true);
        mDialog.show();
    }
}

protected void hideProgressDialog() {
    if (mDialog != null) {
        mHandler.post(new Runnable() {
            @Override
            // this will run on the main thread.
            public void run() {
                mDialog.hide();
            }
        });
    }
}
Était-ce utile?

La solution

Créer un Handler et passer un Runnable pour qu'il fonctionne sur le thread principal.

1) Déclarer Handler dans le constructeur onCreate() méthode par Handler handler = new Handler().2) Puis dans votre parseNetworkResponse() appel de la méthode

handler.post(new Runnable() {
           @Override
           // this will run on the main thread.
           public void run() {
               hideProgressDialog();
           }
      });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top