Как использовать loopj get в виджете Android

Я пытаюсь использовать http-запрос json с виджетом, но ничего не происходит, просто сообщение на консоли, как

D/dalvikvm: GC_CONCURRENT освободил 366K, 5% освободил 10713K/11207K, приостановил 5ms+30ms V/AsyncHttpRH: Прогресс 183 из 121 (151%)

См. ниже код

public class MyWidget extends AppWidgetProvider {

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    final int count = appWidgetIds.length;

    for (int i = 0; i < count; i++) {
        int widgetId = appWidgetIds[i];

        String number = getCurrentPrice();
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                R.layout.bitcoin_widget);
        remoteViews.setTextViewText(R.id.textView, number);

        Intent intent = new Intent(context, MyWidget.class);
        intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
                0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.actionButton, pendingIntent);
        appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }
}

String value = "0.00";
private String getCurrentPrice() {
    value = "0.00";
    String url = "https://www.mywebservice.net/stock/";
    AsyncHttpClient client = new AsyncHttpClient();
    client.get(url, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            try {
                String data= new String(responseBody, "UTF-8");
                JSONObject res = new JSONObject(data);
                JSONObject obj = res.getJSONObject("values");
                String last = obj.getString("stock");
                value = last;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            Log.d("STK", error.getMessage());
        }
    });
    return String.format("USD %.2f",Double.parseDouble(value));
}

person user1801745    schedule 17.09.2017    source источник


Ответы (1)


return String.format("USD %.2f",Double.parseDouble(значение));

Поскольку client.get() является асинхронным вызовом, он немедленно выполняется и переходит к оператору return. Вот почему вы не видите никаких изменений, потому что value по-прежнему равно 0. Поместите возврат внутрь onSuccess(). Вам также необходимо вернуть значение из onFailure().

Изменить

Поскольку onSuccess недействителен, вам нужно передать обратный вызов, который будет вызван после синтаксического анализа.

interface ResponseCallback {
     void success(String value);
}

Потом,

getCurrentPrice(new ResponseCallback() {
     @Override
     void success(String value) {
          remoteViews.setTextViewText(R.id.textView, value);
     }
}

Внутри getCurrentPrice (не возвращайте значение) -

private void getCurrentPrice(ResponseCallback callback) {
    ...
    client.get(url, new AsyncHttpResponseHandler() {
         @Override
         public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
              try {
                  ...
                  String last = obj.getString("stock");
                  callback.success(last);
              } catch(...)
          }
person jL4    schedule 17.09.2017
comment
onSuccess() недействителен, не может перенастроить строку - person user1801745; 17.09.2017
comment
@ user1801745 Извините, да, вам нужно реализовать обратный вызов. Проверьте обновленный ответ. - person jL4; 17.09.2017
comment
все еще не работает, изменение loopj для класса AsyncTask и работает на моем устройстве, а не в эмуляторе (D/dalvikvm: GC_CONCURRENT освободил 366 КБ, 5% освободил 10713 КБ/11207 КБ, приостановил 5 мс + 30 мс V/AsyncHttpRH: прогресс 183 из 121 (151% )) Кажется, это слишком много для виджета...!? - person user1801745; 17.09.2017