Обновление потока пользовательского интерфейса после сетевого запроса в библиотеке Android волейбола
Я решил попробовать Volley, поэтому в настоящее время у меня много выносок REST, поэтому я обычно создаю класс RequestHandler и ResponseHandler, который, как их имена, предлагает запросы на обработку и ответы соответственно. Я следую этой схеме, чтобы я не писал избыточный код. Я просто передаю динамический запрос /url в качестве параметра и с помощью ключа switch обрабатываю ответ на каждый из запросов. Но я застрял с проблемой ниже:
У меня нет способа обновить поток UI, из которого я вызываю класс RequestHandler. То, что я уже пробовал или уже знаю:
- Сделать элементы пользовательского интерфейса (Textview, Listview) статическими и обновить их после ответа.
- Передать контекстный параметр и обновить интерфейс после получения ответа.
- Напишите запрос и ответ как внутренние классы в рамках Activity.
- Избавьтесь от Volley.
Мне было интересно, как вы, ребята, это делаете? Является ли какой-либо шаблон лучше, чем шаблон обработчика запроса/ответа? Любой способ обновления потока пользовательского интерфейса после того же шаблона?
Спасибо заранее!
Ответы
Ответ 1
Я использую залп, и это то, что я делаю. Код идет в любом месте вашей деятельности.
import com.android.volley.Response.Listener;
import static com.android.volley.Response.ErrorListener;
Listener<YOURDATACLASS> successListener = new Listener<YOURDATACLASS>() {
@Override
public void onResponse(YOURDATACLASS data) {
// Check to make sure that the activity hasn't been destroyed while the call was in flight.
if (! isFinishing()) {
//DO YOUR UI UPDATE, such as
TextView textview = (TextView) findViewById(R.id.yourtextview);
textview.setText("blah blah blah");
}
}
};
ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//DO SOMETHING ON FAILURE
}
YOURAPICALL(successListener, failurelistener);
Ответ 2
Это работает для меня.
Map<String, String> params = new HashMap<>();
params.put("dep", DEP);
CustomPostRequest request = new CustomPostRequest(Request.Method.POST, Uris.URL_GET_DEP_CAT, params,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
List<PCatValues> valores = parsear_y_devolver_valores(jsonObject);
gestionar_entregas(valores);
//aqui quitar los dialogos
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
ApiController.getInstance().addToRequestQueue(request);
ApiController - мой одиночный класс Aplication.
public class ApiController extends Application {
public static final String TAG = ApiController.class.getSimpleName();
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static ApiController mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
/*FacebookSdk.sdkInitialize(getApplicationContext());
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.example.android.facebookloginsample", // replace with your unique package name
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.e("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (PackageManager.NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}*/
}
public static synchronized ApiController getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req) {
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
}