【问题标题】:Android Volley StringRequest not working sometimesAndroid Volley StringRequest 有时不工作
【发布时间】:2019-03-22 15:45:34
【问题描述】:

我正在使用下面的代码从 API 获取一些本地视频 URL。

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() 有效。有时,它不起作用。奇怪的是,即使在我的catch() 上使用Exception 之后,我也没有收到任何错误。如果它不起作用,我会做一个Clean Project -&gt; Rebuild Project -&gt; Make Project 并且它会再次起作用。但是在几次构建之后,主要是再构建 1 次之后,它又停止了工作。

如果您想了解更多关于 playLoopVideo 的信息,请查看我制作的这个SO question。这是关于我的应用程序的视频播放部分。如果我尝试在 getVideoAds 的 onResponse 中播放视频,它目前不会播放视频,这就是我为它提出不同问题的原因,因为如果我修复了我的 Volley,视频可能会再次播放。

如果你需要,这是我的 build.gradle(app)。

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() 方法在另一个方法中调用,该方法调用在同一服务器上的不同API 上创建StringRequest 的方法。为了更容易理解,下面是它的代码。

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

目前,getMessageAds() 调用的 API 不返回任何内容。我试图评论它和下面的处理程序,它终于奏效了。甚至视频播放也有效。然后我尝试取消注释getMessageAds() 并在服务器上添加一些消息,一切正常。但在我删除消息后,它又停止工作了。

发生这种情况的原因可能是什么?

【问题讨论】:

  • new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("Error", error.toString()); } }); 尝试在这里调试。如果发生任何错误,您将在此处收到错误消息。
  • 正如我所说,我在任何地方都没有收到任何错误。在我的真实代码中,我什至在Response.ErrorListener 内有一个Toast,但它出现了。这是我在Response.ErrorListener 中的ToastToast.makeText(ctx, "VideoAds Err: "+error.getLocalizedMessage(), Toast.LENGTH_LONG).show();
  • 你检查过catch块吗?
  • 请看我的更新。
  • @Al-Amin 抱歉。我的意思是Toast 没有出现。我的一些拼写错误。

标签: android android-volley


【解决方案1】:

在 volley 中添加这个

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

【讨论】:

  • 我应该放哪个StringRequest 代码?我的应用上有 2 个StringRequest
  • 只要放在这段代码上面:-> queue.add(stringRequest);
  • 但是在 getMessageAds() 失败后我真的不需要重试,因为它目前实际上没有任何东西可以从服务器获取。
  • 它不是仅用于重试。它是用于长请求。如果您的服务器延迟放置一些数据,那么您可以使用它
  • 哦,我明白了。总有一天我会尝试使用它
猜你喜欢
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多