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.

  • Wie man einen Wert von einem Fragment zu einem anderen in Android übergeben?
  • Service kann nicht gestartet werden Intent: nicht gefunden
  • Wie implementiere ich .get Feature mit FutureTask oder BackgroundTask mit Android?
  • Android: Radio-Taste in benutzerdefinierten Listenansicht
  • SensorEventListener wird nicht mit unregisterListener () Methode unregistriert
  • Glitch beim Animieren verschachtelter Ansichten in einem gemeinsamen Element Aktivitätsübergang?
  • 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(); } } }); } 

  • Android-Variablen in strings.xml
  • Kalenderausgabe im Hinzufügen von Monat +1 bis zum Kalendermonat in Android
  • Android TabPage Indicator Inhalt Wrapping Problem
  • Android 4.0 - API Level 14 vs Google APIs (Google Inc.) - API Level 14: Was ist der Unterschied?
  • Wie man den Android-Fragment-View-Status wiederherstellt
  • In welcher Periode ändert sich das App-Brand der Firebase und wie man es verwaltet?
  • 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.