2015-01-20 3 views
3

Я разработал все свое приложение с помощью Volley с различными классами (POJO, Parser, JSON-запрос) для разных разделов навигационного ящика (всего 7), однако после того, как все было запущено, я понял, что ему нужно использовать синхронные/блокирующие запросы какой залп обычно не делает. Все запросы Volley являются асинхронными, что означает, что иногда я нажимаю кнопку или элемент ящика, и он не показывает никаких результатов, потому что асинхронный запрос не завершился.Синхронное подключение Android к REST/JSON - Volley, VolleyPlus или дооснащение?

Я сделал некоторые исследования и нашел несколько вариантов:

Я с трудом найти учебники или примеры первых двух вариантов отправки запросов GET/POST с параметрами (X-Auth-Token, Content-Type, Accept application/json и т. д.) и переход на «Дооснащение» означает, что мне придется выбросить весь код, который я уже написал, и перезапустить с нуля.

Какова ваша рекомендация? Любые примеры Volley/VolleyPlus или учебники для этого варианта использования? Будет ли переход на «Модернизацию» стоить повторной работы?

UPDATE:

Я начал играть с Модернизированным и заменить некоторые из моих звонков волейбола. Идеально! Он делает именно то, что я хотел с еще меньшим количеством кода, чем волейбол. Пока я не занимаюсь автоматическим разбором, просто получаю необработанный HTTP-ответ в формате JSON и отправляю на предыдущие классы парсеров, которые у меня были, но в конечном итоге я их заменю, когда я получу свою голову вокруг POJO и GSON. Мне пришлось отключить строгий режим для основного действия для синхронных вызовов и добавить try/catch для устранения некоторых ошибок. Вот код Переоборудование на одном из способов:

RestAdapter.Builder builder = new RestAdapter.Builder() 
      .setEndpoint(neutronURL) 
      .setLogLevel(RestAdapter.LogLevel.FULL) 
      .setClient(new OkClient(new OkHttpClient())); 
    builder.setRequestInterceptor(new RequestInterceptor() { 
     @Override 
     public void intercept(RequestFacade request) { 
      request.addHeader("X-Auth-Token", authToken); 
     } 
    }); 
    RestAdapter adapter = builder.build(); 
    SecurityAPI api = adapter.create(SecurityAPI.class); 
    if (security == null){ 
     pDialog.setMessage("Contacting Server..."); 
     pDialog.show(); 
    } 

    try { 
     Response result = api.getSecSync(); 
     security = getRawJSON(result); 
    } catch (RetrofitError e) { 
     Log.d("Retrofit Error", e.toString()); 
     if (e.toString().contains("Unauthorized")){ 
      tokenExpiredAlert(); 
     } 
     if (offline==0 && e.toString().contains("Unable to resolve host")){ 
      offlineAlert(); 
     } 
    } 

И интерфейс он называет:

public interface SecurityAPI { 
@Headers({ 
     "Accept: application/json", 
     "Content-Type: application/json; charset=utf-8" 
}) 
@GET("/v2.0/security-groups") 
//void getSecurityContent(Callback<Response> callback); 
Response getSecSync(); 

}

UPDATE2:

О VolleyPlus, как бы я использовать его с этот код? Я пытался, но не получил его на работу, есть несколько ошибок, о абстрактных классах:

 JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Log.d("Nova on Response", response.toString()); 
        setNovaJSON(response.toString()); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        VolleyLog.d("Nova on Error", "Error: " + error.getMessage()); 
        setNovaJSON(error.toString()); 
       } 
      } 
    ) { 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("X-Auth-Token", authToken); 
      params.put("Accept", "application/json"); 
      params.put("Content-Type", "application/json; charset=utf-8"); 
      return params; 
     } 

    }; 


    queue = VolleySingleton.getInstance(this).getRequestQueue(); 
    //VolleySingleton.getInstance(this).addToRequestQueue(getRequest); 
    queue.add(getRequest); 
+0

Недавно я создал клиент WebAPI Spotify Rest, используя Volley https://github.com/SiegenthalerSolutions/spotify-web-api-android, возможно, он может вам помочь! Приветствия. –

+0

Вы никогда не должны делать синхронного или ждать запроса в потоке пользовательского интерфейса (Основной поток). –

+0

Должно быть синхронно, нет другого пути. Когда я нажимаю раздел ящика навигации, мне нужны данные, которые будут отображаться на фрагменте. Используя асинхронный запрос волейбола, фрагмент просто показывает пустой, и мне нужно снова щелкнуть его, чтобы получить данные. – GITcommitEd

ответ

2

Это не может полностью ответить на ваш вопрос, но просто я поделюсь своим мнением.

Как ведущий Android-разработчик для запуска, я начал с Volley (к концу 2013 года) и столкнулся с проблемами. В течение недели я перешел на «Дооснащение».

Synchronouss vs Asynchronous поставляется в виде обратных вызовов. Если обратный вызов присутствует, Retrofit знает, как запустить его асинхронно, иначе он ждет возврата значения.

+0

Спасибо, что чем больше я прочитаю, тем больше похоже, что Retrofit сделает все, что я хочу, намного проще.Документация Volley отстойна, и трудно найти информацию о простых вещах, таких как sync vs async. Однако я действительно хотел попытаться придерживаться волейбола, так как мне пришлось бы перекодировать 30+ классов, если бы я мог найти способ правильно работать с запросами синхронизации и индикаторами выполнения, это сэкономит мне много времени – GITcommitEd

+0

См. ОБНОВЛЕНИЕ выше – GITcommitEd

2

Если вы хотите использовать VolleyPlus для синхронного запроса, это очень просто.

Volley является заменить VolleyTickle

RequestQueue заменяется RequestTickle

request.start() дает NetworkResponse.

StringRequest request = new StringRequest(Method.POST, apiUrl, null, null); 

    RequestTickle mRequestTickle = VolleyTickle.newRequestTickle(getApplicationContext()); 
    mRequestTickle.addRequest(request); 
    NetworkResponse response = mRequestTickle.start(); 
    if(response.StatusCode = 200){ 
     String data = VolleyTickle.parseResponse(response); 
    } 
+0

См. UPDATE2 выше, я не мог заставить его работать с JSON-запросами – GITcommitEd

+0

Я не могу понять, какую проблему вы получаете с JsonObjectRequest. Я пробовал ваш код, и он работает. Если вы можете публиковать ошибки, я был бы рад помочь. Вот пример, который работает https://github.com/DWorkS/VolleyPlus/blob/master/sample/src/com/volley/demo/ExampleJsonRequest.java – 1HaKr

+0

Это то, что я получаю: Ошибка: (118, 46) error : не является абстрактным и не переопределяет абстрактный метод onErrorResponse (VolleyError) в ErrorListener Ошибка: (119, 21) error: метод не переопределяет или не реализует метод из супертипа Ошибка: (126, 40) error: getHeaders() в не может переопределить getHeaders() в запросе переопределенный метод не выбрасывает AuthFailureError – GITcommitEd

1

Это очень просто с помощью Дооснащение сделать синхронный вызов:

public interface TaskService { 
    @GET("/tasks") 
    List<Task> getTasks(); 
} 

[..] 

List<Task> tasks = getTasks(); 

и асинхронный:

@GET("/tasks") 
void getTasks(Callback<List<Task>> callback); 

[..] 

getTasks(new Callback<List<Task>>() { 
     @Override 
     public void success(List<Task> tasks, Response response) { 
     } 
    }; 

);

Больше на источник: https://futurestud.io/blog/retrofit-synchronous-and-asynchronous-requests/

0

Есть несколько так же названные элементы в двух, которые разделяют разные namespaces.I была аналогичная проблема и пришлось изменить некоторые из ниже перечисленных однажды я удалил залп и заменить его с volleyplus для размещения для загрузки нескольких файлов без необходимости использования HttpEntity и Multipart Entity:

  • com.android.volley.VolleyError к com.android.volley.error.VolleyError
  • com.android.volley.toolbox.JsonObjectRequest к com.android.volley.request.JsonObjectRequest
  • com.android.volley.AuthFailureError к com.android.volley.error.AuthFailureError
Смежные вопросы