【问题标题】:android how to make validation url available from retrofitandroid如何从改造中提供验证url
【发布时间】:2020-09-30 04:33:08
【问题描述】:

为了检查 youtube url 是否可用,我使用了改造,它运行良好,但我想用它作为验证我卡住了,这是我的代码:

CheckUrlHelper.java

private static final String BASE_URL= "https://youtu.be/";    
public void CheckUrl(String youtube_id)
        {
            retrofit=new Retrofit.Builder().baseUrl(BASE_URL+youtube_id).build();
    
            Call<ResponseBody> call= retrofit.create(CheckUrlAvailable.class).checkUrl();
            call.enqueue(new Callback<ResponseBody>()
            {
                @Override
                public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
                    //Log.d("","response : "+response);
                    if(response.code() == 200)
                    {
                        result = "true";
                    }
                    else
                    {
                        result = "false";               
                    }
                }
    
                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {
                    result = "false";
                }
        });
            listener.getResult(result);
        }
    
        public interface callbackListener {
            void getResult(String result);
        }

我尝试过使用上面代码之类的界面,但导致错误。

我的期望:得到结果(如果可能从代码中得到结果,无论是 200、500 还是等),所以:

MyClass.java

private String error_message;

        public void onClick(View v) {
                        String video_link = editVideoLink.getText().toString();
                        CheckUrlHelper curl = new CheckUrlHelper();
                        
    /* MY Expectation */
    
        if(curl.CheckUrl(video_link) == 200){
           Toast.makeText(getActivity(),"url available",Toast.LENGTH_SHORT).show();
        } else {
           Toast.makeText(getActivity(),"url not available",Toast.LENGTH_SHORT).show();
        }

/**** Edit ****/

  String video_link = editVideoLink.getText().toString();
  if(TextUtils.is_empty(video_link){
     error_message = "Link cannot be empty";
  } else if(/* methodNamewhatever(video_link) == false*/ OR /* methodNamewhatever(video_link) == 404*/){
    error_message = "Invalid Link";
}else{
   // save
}
Toast.makeText(getActivity(),error_message,Toast.LENGTH_SHORT).show();

所以当用户将 youtube id 放在 editText 上然后点击提交时,它可能会给出结果作为验证。

请帮帮我

谢谢

【问题讨论】:

    标签: java android retrofit2


    【解决方案1】:

    嗯,你放错了听众的位置。而不是从所有函数中调用它,您需要在每个方法中调用它一次,以便在onResponseonFailure 回调中触发响应后获得结果。

    所以你必须把你的代码改成这样

        private static final String BASE_URL= "https://youtu.be/";
    public void CheckUrl(String youtube_id, callbackListener listener)
    {
        retrofit = new Retrofit.Builder().baseUrl(BASE_URL+youtube_id).build();
    
        Boolean result = false;
    
        Call<ResponseBody> call= retrofit.create(CheckUrlAvailable.class).checkUrl();
        call.enqueue(new Callback<ResponseBody>()
        {
            @Override
            public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
                //Log.d("","response : "+response);
                if(response.code() == 200)
                {
                    result = true;
                }
                else
                {
                    result = false;
                }
                listener.getResult(result);
            }
    
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                result = false;
                listener.getResult(result);
            }
        });
        
    }
    
    public interface callbackListener {
        void getResult(Boolean result);
    }
    
    

    【讨论】:

      【解决方案2】:

      我已经为你创建了一些代码 sn-ps 只是尝试用它来解决你的问题。

      CheckUrlHelper.java

          private static final String BASE_URL= "https://youtu.be/";
      public void CheckUrl(String youtube_id, callbackListener listener)
      {
          retrofit = new Retrofit.Builder().baseUrl(BASE_URL+youtube_id).build();
      
          Boolean result = false;
      
          Call<ResponseBody> call= retrofit.create(CheckUrlAvailable.class).checkUrl();
          call.enqueue(new Callback<ResponseBody>()
          {
              @Override
              public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
                  //Log.d("","response : "+response);
                  if(response.code() == 200)
                  {
                      result = true;
                  }
                  else
                  {
                      result = false;
                  }
                  listener.getResult(result);
              }
      
              @Override
              public void onFailure(Call<ResponseBody> call, Throwable t) {
                  result = false;
                  listener.getResult(result);
              }
          });
          
      }
      
      public interface callbackListener {
          void getResult(Boolean result);
      }
      

      并在

      中修改你的点击代码

      MyClass.java

      public void onClick(View v) {
          String video_link = editVideoLink.getText().toString();
          CheckUrlHelper curl = new CheckUrlHelper();
          //curl.CheckUrl(video_link);
      
          curl.CheckUrl(video_link, new callbackListener() {
              @Override
              public void getResult(Boolean result) {
                  if(result){
                      Toast.makeText(getActivity(),"url available",Toast.LENGTH_SHORT).show();
                  } else {
                      Toast.makeText(getActivity(),"url not available",Toast.LENGTH_SHORT).show();
                  }
      
              }
          });
      

      希望这能解决您的问题。

      【讨论】:

      • 您好,你们的代码运行良好,但不是我的预期,请参阅 MyClass.java 我已经编辑了我的帖子并提供了更完整的代码,所以我期望的是创建能够连接到改造的方法,然后使用它来验证 URL 链接。如果我的方式错误,请告诉我另一种解决方案作为替代方案。谢谢
      • 您正在考虑阻止网络调用,但 android 不允许在主线程中进行网络调用。您可以按照您的想法进行操作,但它需要另一个后台线程来执行您的网络操作。尝试调用改造的执行方法而不是 enqueue ,执行执行相同的线程(阻塞)网络调用。或者最好使用我提供的非阻塞解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多