Domanda

Sto cercando di mostrare un indicatore di avanzamento quando si esegue richieste di rete con Volley.Sto ricevendo l'errore "Solo il thread originale che crea una gerarchia di vista può toccare le sue opinioni".Non riesco a capire come ottenere il mio hideprogressdialog () allo stesso thread di showprogressdialog ().Ecco il mio codice ...

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();}
    };
}
.

Soluzione

Grazie a Tautvydas.Ho finito per mettere questi metodi nella mia classe 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();
            }
        });
    }
}
.

È stato utile?

Soluzione

Crea un Handler e passare un Runnable per correreil filo principale.

1) Dichiarare Handler nel costruttore sul metodo onCreate() da Handler handler = new Handler().2) Quindi nella chiamata del metodo parseNetworkResponse()

handler.post(new Runnable() {
           @Override
           // this will run on the main thread.
           public void run() {
               hideProgressDialog();
           }
      });
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top