Warum Android Circle Fortschritt Dialog, der friert, wenn Bunch von Daten Synchronisierung von Server zu lokalen DB mit Retrofit

1.Iam holen Bulk von Daten aus dem Server und Einfügen in die lokale Datenbank während der Anmeldung in Android.

2.For Syncing Zweck Ich habe verwendet Retrofit-Bibliothek , Synchronisierung und Einfügen Working Fine.

Mein Problem: Beim Synchronisieren von Bündel von Daten vom Server Verwenden von Retrofit , Circle Progress Dialog Getting Freeze .

Hilf mir, wie du dieses Problem beheben kannst.

EDIT: 1

Called Retrofit-Methode in Async-Aufgabe, noch Circle ProgressDialog Getting Freeze

// Aufruf der Async-Task

Asynctask_Getdata task=new Asynctask_Getdata(TokenType_StringValue,Access_Token_StringValue, ID_StringValue); task.execute(); 

// AsyncTask MEthod

 public class Asynctask_Getdata extends AsyncTask<String,Void,Void> { String TokenType_StringValueitem; String Access_Token_StringValueitem; String ID_StringValueitem; public Asynctask_Getdata(String tokenType_StringValueitem, String access_Token_StringValueitem, String ID_StringValueitem) { TokenType_StringValueitem = tokenType_StringValueitem; Access_Token_StringValueitem = access_Token_StringValueitem; ID_StringValueitem = ID_StringValueitem; } @Override protected void onPreExecute() { super.onPreExecute(); if (!pDialog.isShowing()) { pDialog.setIndeterminate(true); pDialog.setCanceledOnTouchOutside(false); pDialog.setMessage("Please Wait Getting Data..."); pDialog.show(); } } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); } @Override protected Void doInBackground(String... params) { getLoginDataCall(TokenType_StringValueitem, Access_Token_StringValueitem, ID_StringValueitem ); return null; } } private void getLoginDataCall(String TokenType_String, String Access_Token_StringValue, String RouteID_String) { String Tokenadd = TokenType_String + " Access_Token_StringValue; sisClient.getApi().getAllData(Tokenadd, RouteID_String, new Callback<CommonResponse>() { @Override public void success(CommonResponse commonResponse, Response response) { Timber.d("sendOtpAPICall%s", commonResponse.getStatusCode()); switch (commonResponse.getStatusCode()) { case 200: try { JSONArray jsonarray = null; try { jsonarray = new JSONArray(commonResponse.getRouteMaster()); if (!commonResponse.getRouteMaster().equals("[]")) { for (int i = 0; i < jsonarray.length(); i++) { JSONObject jsonobject = jsonarray.getJSONObject(i); RouteId_StringValue = jsonobject.getString("RouteId"); Asynxfor_Route_Master_insert(RouteId_StringValue); } } else { System.out.println("ROute Master Is NULL ::" + commonResponse.getStatusMessage() + "\n"); } } catch (Exception e) { e.printStackTrace(); ; } break; case 404: pDialog.dismiss(); Toast.makeText(LoginPage.this, R.string.wrong_Username_or_password, Toast.LENGTH_LONG).show(); break; case 500: pDialog.dismiss(); Toast.makeText(LoginPage.this, R.string.something_wrong, Toast.LENGTH_LONG).show(); break; } } @Override public void failure(RetrofitError error) { try { if (error != null) { pDialog.dismiss(); Timber.i("sendOtpAPICall error %s", error.getResponse().getStatus()); String json = new String(((TypedByteArray) error.getResponse().getBody()).getBytes()); Timber.i("failure error %s", json.toString()); JSONObject json1 = new JSONObject(json.toString()); String json1string = json1.getString("StatusMessage"); switch (error.getResponse().getStatus()) { case 404: Toast.makeText(getApplicationContext(), R.string.wrong_Username_or_password, Toast.LENGTH_LONG).show(); break; case 500: Toast.makeText(LoginPage.this, R.string.something_wrong, Toast.LENGTH_LONG).show(); break; default: Toast.makeText(LoginPage.this, json1string, Toast.LENGTH_LONG).show(); break; } } else { Timber.i("failure error %s", "Recieving error null rom server"); } } catch (Exception e) { e.printStackTrace(); Toast.makeText(LoginPage.this, R.string.something_wrong, Toast.LENGTH_LONG).show(); } } }); } 

  • Wie man die Antwort Körper JSON Umwandlung in Retrofit anpassen?
  • Retrofit gibt EOFException erst das erste Mal
  • Robolectric + OkHttp + Retrofit + rxJava Einheit Test
  • Halten Sie einen Hintergrundprozess in robospice
  • So erstellen Sie ein retrofit.Response Objekt während Unit Testing mit Retrofit 2
  • Verwenden der Call Enqueue-Funktion in Retrofit
  • Warum ist Reaktionszeit (für Rest Call) langsamer in Android im Vergleich zum PC?
  • Nachrüst-Gson-Konverter für verschachtelte Json mit verschiedenen Objekten
  • 4 Solutions collect form web for “Warum Android Circle Fortschritt Dialog, der friert, wenn Bunch von Daten Synchronisierung von Server zu lokalen DB mit Retrofit”

    Es gibt keinen guten Grund, in diesem Fall eine Synchronisation zu machen. Nachfolger sollten Sie einen asynchronen Anruf verwenden, der aus der Box von Retrofit bereitgestellt wird. Es ist ganz einfach, und du kannst deine ProgressBar-Staaten mit den Callbacks verwalten.

    IMO solltest du AsyncTask überhaupt nicht benutzen. Wenn du diesen Ausflug erforschen willst, dann das und das .

    Beispiel Code-Konvertierung von Retrofit v1 Sync-Aufruf mit AsyncTask, um 2 async-Aufruf umzuwandeln, in der api-Klasse verwaltet und mit Otto-Ereignisbus für Nachrichtenübergabe verwendet:

     public class ApiService { private static ApiService INSTANCE; // thwart instantiation by protecting protected ApiService() { // nothing } public static ApiService getInstance() { if (INSTANCE == null) { INSTANCE = new ApiService(); } return INSTANCE; } // ----------------------------------------------------------------------------------- private static final String BASE_URL = "http://api.service.com/"; private interface ApiServiceInterface { @GET("your/endpoint") Call<CommonResponse> postLogin(@Query("token_add") String tokenAdd, @Query("route_id") String RouteId); } private ApiServiceInterface apiServiceInterface = null; private ApiServiceInterface getInterface() { if (apiServiceInterface == null) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .build(); Retrofit retrofit = new Retrofit.Builder() .client(client) .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); apiServiceInterface = retrofit.create(ApiServiceInterface.class); } return apiServiceInterface; } public void doGetData(Dialog pDialog, String TokenType_String, String Access_Token_StringValue, String RouteID_String) { if (!pDialog.isShowing()) { pDialog.setIndeterminate(true); pDialog.setCanceledOnTouchOutside(false); pDialog.setMessage("Please Wait Getting Data..."); pDialog.show(); } String Tokenadd = TokenType_String + Access_Token_StringValue; getInterface().postLogin(Tokenadd, RouteID_String) .enqueue(new Callback<SocketCtrlResponse>() { @Override public void onResponse(Call<CommonResponse> call, Response<CommonResponse> response) { Timber.d("sendOtpAPICall%s", commonResponse.getStatusCode()); switch (commonResponse.getStatusCode()) { case 200: JSONArray jsonarray = null; try { jsonarray = new JSONArray(commonResponse.getRouteMaster()); if (!commonResponse.getRouteMaster().equals("[]")) { for (int i = 0; i < jsonarray.length(); i++) { JSONObject jsonobject = jsonarray.getJSONObject(i); RouteId_StringValue = jsonobject.getString("RouteId"); //Asynxfor_Route_Master_insert(RouteId_StringValue); EventBus.getDefault().post(new GetDataResponseEvent(RouteId_StringValue)); } } else { System.out.println("ROute Master Is NULL ::" + commonResponse.getStatusMessage() + "\n"); } } catch (Exception e) { e.printStackTrace(); } break; case 404: pDialog.dismiss(); Toast.makeText(LoginPage.this, R.string.wrong_Username_or_password, Toast.LENGTH_LONG).show(); EventBus.getDefault().post(new GetDataResponseEvent("")); break; case 500: pDialog.dismiss(); Toast.makeText(LoginPage.this, R.string.something_wrong, Toast.LENGTH_LONG).show(); EventBus.getDefault().post(new GetDataResponseEvent("")); break; } } @Override public void onFailure(Call<CommonResponse> call, Throwable t) { t.printStackTrace(); pDialog.dismiss(); Toast.makeText(LoginPage.this, R.string.something_wrong, Toast.LENGTH_LONG).show(); EventBus.getDefault().post(new GetDataResponseEvent("")); } }); } } 

    Sie benötigen eine Ereignisklasse, um die Daten zu verpacken, die Sie erwarten, um von der API zurückzukehren, zB:

     public class GetDataResponseEvent { private final String data; public GetDataResponseEvent(String data) { this.data = data; } public String getData() { return data; } } 

    Und als Beispiel für den Aufruf der Dienstleistung aus einer Activity :

     public class YourActivity extends Activity { Dialog pDialog; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // init pDialog, content view, etc. EventBus.getDefault().register(this); // ... } // ... public void getDataFromApi() { ApiService.getInstance().doGetData(pDialog, TokenType_StringValue,Access_Token_StringValue, ID_StringValue); } // ... public void onEvent(GetDataResponseEvent event) { String data = event.getData(); Asynxfor_Route_Master_insert(data); } // ... } 

    Beachten Sie noch einmal, dass Sie auf Retrofit 2 aktualisieren und Otto verwenden müssen . Ich habe diese Implementierung erraten, damit es nicht so funktionieren kann, aber es sollte eine gute Skizze sein, um das Gefühl davon zu bekommen.

    Sie können pDialog.dismiss(); nicht verwenden pDialog.dismiss(); Und Toast.makeText in doInBackground .

    Sie müssen es in einer Methode, die Zugriff auf die UI-Thread wie onProgressUpdate() und onPostExecute() .

    Dies ist dein RestInteface, wo du die Anrufe definierst

     interface RestInterface { String BASE_URL = "https://you_have_to_specify.com/if_anything/"; @GET("your_api") Call<ModelResponse> getRouteId(@Query String valueItem); } 

    Dies ist die Implementierungsklasse, von wo aus Sie anrufen

     public class RestService { private RestInterface restInterface; private OkHttpClient okHttpClient; public RestService() { OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder(); if (BuildConfig.DEBUG) { HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); clientBuilder.addInterceptor(httpLoggingInterceptor); } okHttpClient = clientBuilder.build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(RestInterface.BASE_URL) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build(); restInterface = retrofit.create(RestInterface.class); } //this is the exposed method public void getRoute(String valueId, Callback<ModelResponse> callback){ Call<ModelResponse> call = restInterface.getRouteId(valueId); call.enque(callback); } } 

    Diese Klasse sollte im Format Ihrer empfangenen Antwort sein

     public class ModelResponse{ String RouteId; public String getRouteId(){ return RouteId; } } 

    Geben Sie nun aus Ihrer Aktivität (oder Ihrer bevorzugten Klasse) ein Objekt von RestService an und rufen Sie die Methode getRoute () auf, übergeben Sie Ihre Abfragezeichenfolge und ein anonymes Callback-Objekt (Retrofit 2 Callback-Schnittstelle) als Parameter. Sie erhalten das Ergebnis im anonymen Rückrufobjekt als Antwort. // später hinzugefügt Ihre Implementierungsklasse

     public class FromWhereYourApiIsCalled{ RestService restService = new RestService(); public void callRouteIdMethod(String value){ progressDialog.show();// define progress dialog before restService.getRoute(value, new Callback<ModelResponse>() { @Override public void onResponse(Call<ModelResponse> call, Response<ModelResponse> response) { progressDialog.dismiss(); Log.v("route Id", response.body().getRouteId()); } @Override public void onFailure(Call<ModelResponse> call, Throwable t) { progressDialog.dismiss(); } }); } } 

    Es gibt zwei mögliche Ursachen für Einfrieren Problem.

    Zuerst : Ihr Anforderungsvorgang läuft auf dem UI-Thread der Anwendung, was nicht empfohlen wird.

    Zweitens : Du versuchst, deine App auf einem alten Gerät zu testen, das einen alten Prozessor hat.

    Ich würde Ihnen vorschlagen, die eigenen asynchronen Anfragen von Retrofit zu verwenden, die hier beschrieben wird . Der Kerl, der dir gesagt hat, dass du den dialog.dismiss() auf den dialog.dismiss() rufen dialog.dismiss() ist richtig. Es kann auch deine App einfrieren. Hier ist ein gutes Beispiel, wie man es mit der Methode runOnUiThread()

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.