Ответ 1
в целом, это хорошая практика, чтобы разделить такие вещи, так что вы на правильном пути, подумайте над тем, чтобы создать класс singelton, который обрабатывает ваши запросы - это очень общий шаблон, но должен получите структуру:
создайте одноэлементный класс, который вы устанавливаете при появлении приложения:
public class NetworkManager
{
private static final String TAG = "NetworkManager";
private static NetworkManager instance = null;
private static final String prefixURL = "http://some/url/prefix/";
//for Volley API
public RequestQueue requestQueue;
private NetworkManager(Context context)
{
requestQueue = Volley.newRequestQueue(context.getApplicationContext());
//other stuf if you need
}
public static synchronized NetworkManager getInstance(Context context)
{
if (null == instance)
instance = new NetworkManager(context);
return instance;
}
//this is so you don't need to pass context each time
public static synchronized NetworkManager getInstance()
{
if (null == instance)
{
throw new IllegalStateException(NetworkManager.class.getSimpleName() +
" is not initialized, call getInstance(...) first");
}
return instance;
}
public void somePostRequestReturningString(Object param1, final SomeCustomListener<String> listener)
{
String url = prefixURL + "this/request/suffix";
Map<String, Object> jsonParams = new HashMap<>();
jsonParams.put("param1", param1);
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, new JSONObject(jsonParams),
new Response.Listener<JSONObject>()
{
@Override
public void onResponse(JSONObject response)
{
Log.d(TAG + ": ", "somePostRequest Response : " + response.toString());
if(null != response.toString())
listener.getResult(response.toString());
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error)
{
if (null != error.networkResponse)
{
Log.d(TAG + ": ", "Error Response code: " + error.networkResponse.statusCode);
listener.getResult(false);
}
}
});
requestQueue.add(request);
}
}
когда ваше приложение появится:
public class MyApplication extends Application
{
//...
@Override
public void onCreate()
{
super.onCreate();
NetworkManager.getInstance(this);
}
//...
}
простой интерфейс прослушивателя для вашего обратного вызова (отдельный файл будет полезен):
public interface SomeCustomListener<T>
{
public void getResult(T object);
}
и, наконец, из любого места, где вы хотите, контекст уже там, просто вызовите:
public class BlaBla
{
//.....
public void someMethod()
{
NetworkManager.getInstance().somePostRequestReturningString(someObject, new SomeCustomListener<String>()
{
@Override
public void getResult(String result)
{
if (!result.isEmpty())
{
//do what you need with the result...
}
}
});
}
}
вы можете использовать любой объект со слушателем, в зависимости от того, что вам нужно получить, это также работает для запросов GET с некоторыми незначительными изменениями (см. этот поток SO для получения дополнительной информации о GET), и вы можете называть это извне (onClicks и т.д.), просто помните, что они должны совпадать между методами.
Надеюсь, что это поможет и не слишком поздно!