android как сделать URL-адрес проверки доступным из retrofit

#java #android #retrofit2

#java #Android #retrofit2

Вопрос:

Чтобы проверить, доступен ли URL-адрес YouTube, я использовал retrofit, он работает хорошо, но я хочу использовать его в качестве проверки, я застрял, вот мой код :

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 в EditText, а затем нажимает «Отправить», это может быть результатом проверки.

пожалуйста, помогите мне

Спасибо

Ответ №1:

Ну, вы потеряли местоположение слушателя. Вместо того, чтобы вызывать его из всех функций, вам нужно вызывать его один раз в каждом методе, чтобы получить результат после запуска ответа onResponse и onFailure обратных вызовов.

Итак, вам нужно изменить свой код, чтобы он был таким

     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:

Я создал несколько фрагментов кода, которые вы просто попытаетесь использовать для решения ваших проблем.

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

        }
    });
  

Надеюсь, это решит ваши проблемы.

Комментарии:

1. Здравствуйте, все ваши коды работают хорошо , но не так, как я ожидал, пожалуйста, посмотрите MyClass.java Мне пришлось отредактировать свой пост и предоставить более полный код, поэтому я ожидаю создать метод, который сможет подключиться к модернизации, а затем использовать его для проверки URL-ссылки. Если мой путь неверен, пожалуйста, подскажите мне другое решение в качестве альтернативы. Спасибо

2. Вы думаете о блокировке сетевого вызова, но Android не разрешает сетевой вызов в основном потоке. Вы можете поступать так, как думаете, но для выполнения вашей сетевой операции потребовался другой фоновый поток. Попробуйте вызвать метод выполнения retrofit вместо постановки в очередь, выполните сетевой вызов того же потока (блокирующий). Или лучше всего использовать предоставленное мной решение для неблокирования.