2016-05-06 4 views
0

Я делаю приложение для Android, и мне нужно сделать JSONObjectRequest, чтобы получить параметр (logo) из package.json в репозитории github.Синхронизация с JSONObjectRequest (Android)

Это метод, где я сделать запрос JSON

public void askLogoPath(String url) { 

    JsonObjectRequest req = new JsonObjectRequest(url, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        try { 
         if (response.has("logo")) 
          Global.getInstance().setLogo(response.getString("logo")); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      error.printStackTrace(); 
     } 
    }); 

    // Adding request to request queue 
    QueueController.getInstance().addToRequestQueue(req); 

} 

Я определил переменную (logo) в Global классе, который следует Singleton шаблон, так что я могу получить доступ к нему везде в моей программе. После выполнения этого запроса я хочу установить переменную со значением логотипа.

Это фрагмент кода, в котором я вызываю предыдущую функцию.

if (full_name != null) { 
     String url = "https://raw.githubusercontent.com/" + full_name + "/master/"; 
     this.askLogoPath(url + "package.json"); 
     this.setLogoPath(Global.getInstance().getLogo()); 
} 

Я заметил, что onResponse часть является последним, чтобы быть выполнены, поэтому, когда я setLogoPath(Global.getInstance.getLogo()) логотип остается пустым, поэтому я не могу установить logoPath в предыдущей строке. Я хотел бы подождать, пока это не будет выполнено, поэтому оно не будет равно нулю.

Есть ли способ сделать это синхронным, чтобы я мог это сделать?

Большое спасибо

ответ

0

Было решено путем добавления обратного вызова . Когда запрос JSON получает ответ, он вызывает метод обратного вызова onSuccess(), а в основной функции остальная часть кода находится внутри этого метода onSuccess().

0

Так как вы хотите, чтобы сделать это синхронно вы можете использовать нить, чтобы заблокировать этот процесс, пока он не закончит

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      //set your logo 
     } 
    }).start(); 

Если вы не возражаете делать это асинхронно использовать AsyncTask , Theres множество примеров через Интернет

0

Вы можете назвать эту строку кода:

this.setLogoPath(Global.getInstance().getLogo()); 

В ответ на ваш AsyncTask. Таким образом, вы можете выполнить эту функцию onComplete() вашего AsyncTask.