Как справиться с "не удается подключиться ..." в модернизации? - PullRequest
0 голосов
/ 05 октября 2018

Так что я использую модификацию для подключения моего приложения к серверу.У меня есть проблема, это когда устройство не имеет подключения, он возвращает «не удается подключиться myservername.dev.com».Я не знаю, как это решить.Я уже решил проблему «без подключения», но все же, когда нет подключения, иногда возвращается «не удается подключиться ...».Любое решение?Я немного расстроен, потому что ничего не нашел в Google.

вот как я подключаю свое приложение с модификацией:

public static final String BASE_URL = "http://myserver.com/admin/api/";
public static Retrofit retrofit = null;

public static Retrofit getApi(final Context context){

    OkHttpClient defaultHttpClient = new OkHttpClient.Builder()
            .addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Interceptor.Chain chain) throws IOException {
                    //getAccessToken is your own accessToken(retrieve it by saving in shared preference or any other option )
                    String accessToken = SharedPreferenceManager.getToken(context);
                    if(accessToken.isEmpty()){
                        Log.e("retrofit 2","User Token is Empty");
                        return chain.proceed(chain.request());
                    }
                    Request authorisedRequest = chain.request().newBuilder()
                            .addHeader("APP_TOKEN", "myservertoken")
                            .addHeader("USER_TOKEN", accessToken)
                            .addHeader("Content_Type", "application/x-www-form-urlencoded")
                            .build();
                    Log.e("retrofit 2","User Token : " + accessToken);
                    return chain.proceed(authorisedRequest);
                }}).addInterceptor(new ConnectivityInterceptor(context)).
                    readTimeout(30, TimeUnit.SECONDS).connectTimeout(30, TimeUnit.SECONDS).build();

    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    if(retrofit == null){
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(defaultHttpClient)
                .build();
    }
    return retrofit;
}

1 Ответ

0 голосов
/ 05 октября 2018

Перед нажатием api вы можете проверить, подключено ли ваше устройство или нет, затем нажмите api

public boolean isNetworkAvialable(Context context) {
        ConnectivityManager cm =
                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        return netInfo != null && netInfo.isConnectedOrConnecting();
    }

. Этот метод возвращает значение true, если ваше устройство имеет подключение, отличное от него, и возвращает false.

и добавьте это разрешение

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Добавьте этот метод для ожидания ответа сервера

if (retrofit == null) {

            HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();

            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .addInterceptor(interceptor.setLevel(HttpLoggingInterceptor.Level.BODY))
                    .connectTimeout(2, TimeUnit.MINUTES)
                    .writeTimeout(2, TimeUnit.MINUTES)
                    .readTimeout(2, TimeUnit.MINUTES)
                    .build();

            retrofit = new Retrofit.Builder()
                    .baseUrl(ApplicationConstant.INSTANCE.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(okHttpClient)
                    .build();
        }
        return retrofit;

и добавьте эту зависимость

implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'

...