Android Volley StringRequest иногда не работает - PullRequest
0 голосов
/ 22 марта 2019

Я использую приведенный ниже код для получения URL-адреса локального видео из API.

public void getVideoAds(String serverURL){
    String url = "http://"+serverURL+"/video/";

    StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONObject jsonObj = new JSONObject(response);
                JSONObject defaultObj = jsonObj.getJSONObject("default");
                JSONArray videoObj = jsonObj.getJSONArray("videos");

                defaultUrl = defaultObj.getString("url");

                for (int i = 0; i < videoObj.length(); i++){
                    JSONObject video = videoObj.getJSONObject(i);

                    VideoAd v = new VideoAd();
                    v.setName(getVideoNameFromLink(video.getString("url")));
                    v.setUrl(video.getString("url"));
                    v.setVideoId(video.getInt("id"));
                    v.setVersion(video.getInt("version"));
                    v.setLocalPath("");

                    vidArrLst.add(v);
                }

                playLoopVideo();
            } catch (Exception e) {
                Log.d(TAG, "getVidAds res err: " + e.getMessage());
            }

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(ctx, "VideoAds Err: "+error.getLocalizedMessage(), Toast.LENGTH_LONG).show();
            Log.d(TAG, "getVidAds err: " + error.getMessage());
        }
    });

    queue.add(stringRequest);
}

А внутри onCreate() я инициализирую RequestQueue следующим образом.

queue = Volley.newRequestQueue(this);

Иногда getVideoAds() работает.Иногда это не работает.Также странно то, что я не получаю никаких ошибок даже после использования Exception на моем catch().Если это не работает, я делаю Clean Project -> Rebuild Project -> Make Project, и это работает снова.Но после нескольких сборок, в основном всего лишь одной сборки, он снова перестает работать.

Если вы хотите узнать больше о playLoopVideo, посмотрите на этот ТАК * вопрос , который я задал.Речь идет о видео-части моего приложения.В настоящее время он не воспроизводит видео, если я пытаюсь воспроизвести его в onResponse getVideoAds, поэтому я сделал для него другой вопрос, потому что, возможно, если я исправлю свой Volley, видео будет воспроизводиться снова.

Это мой build.gradle (приложение), если вам это нужно.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "biz.net.com.streamer"
        minSdkVersion 17
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.google.android.exoplayer:exoplayer:2.9.1'
    implementation 'com.android.volley:volley:1.1.1'
}

ОБНОВЛЕНИЕ:

Это действительно странно.Мой метод getVideoAds() вызывается внутри другого метода, который вызывает метод, который создает StringRequest в другом API на том же сервере.Чтобы облегчить понимание ниже, приведен код для него.

private void getAdvertisements(final String serverURL){
    getVideoAds(serverURL);
    getMessageAds(serverURL);

    new android.os.Handler().postDelayed(
            new Runnable() {
                public void run() {
                    Log.d(TAG, "Updating ads marquee");
                    getMessageAds(serverURL);
                }
            },
            300000);
}

В настоящее время API, который вызывает getMessageAds(), ничего не возвращает.Я попытался прокомментировать это и обработчик ниже, и это наконец сработало.Даже воспроизведение видео сработало.Затем я попытался раскомментировать getMessageAds() и добавить несколько сообщений на сервер, все работает нормально.Но после удаления сообщений оно перестает работать.

В чем может быть причина этого?

1 Ответ

0 голосов
/ 22 марта 2019

Добавьте это залпом

  stringRequest.setRetryPolicy(DefaultRetryPolicy(20000, 3, 1.0f));
...