#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 вместо постановки в очередь, выполните сетевой вызов того же потока (блокирующий). Или лучше всего использовать предоставленное мной решение для неблокирования.