Подтвердить что ты не робот

Обновление потока пользовательского интерфейса после сетевого запроса в библиотеке Android волейбола

Я решил попробовать Volley, поэтому в настоящее время у меня много выносок REST, поэтому я обычно создаю класс RequestHandler и ResponseHandler, который, как их имена, предлагает запросы на обработку и ответы соответственно. Я следую этой схеме, чтобы я не писал избыточный код. Я просто передаю динамический запрос /url в качестве параметра и с помощью ключа switch обрабатываю ответ на каждый из запросов. Но я застрял с проблемой ниже:

У меня нет способа обновить поток UI, из которого я вызываю класс RequestHandler. То, что я уже пробовал или уже знаю:

  • Сделать элементы пользовательского интерфейса (Textview, Listview) статическими и обновить их после ответа.
  • Передать контекстный параметр и обновить интерфейс после получения ответа.
  • Напишите запрос и ответ как внутренние классы в рамках Activity.
  • Избавьтесь от Volley.

Мне было интересно, как вы, ребята, это делаете? Является ли какой-либо шаблон лучше, чем шаблон обработчика запроса/ответа? Любой способ обновления потока пользовательского интерфейса после того же шаблона?

Спасибо заранее!

4b9b3361

Ответ 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);
    }

}

}