How to use loopj get in Android Widget

63 Views Asked by At

I am trying to use json http request with Widget but nothing happens just a message on console as

D/dalvikvm: GC_CONCURRENT freed 366K, 5% free 10713K/11207K, paused 5ms+30ms V/AsyncHttpRH: Progress 183 from 121 (151%)

See bellow the code

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));
}
1

There are 1 best solutions below

3
On

return String.format("USD %.2f",Double.parseDouble(value));

Because client.get() is an async call, it immediately executes and moves on to the return statement. That is why you see no change because the value is still 0. Put the return inside onSuccess(). You also need to return a value from onFailure().

Edit

Since onSuccess is void, you need to pass in a callback which will be called after the parsing.

interface ResponseCallback {
     void success(String value);
}

Then,

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

Inside getCurrentPrice (don't return the value) -

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(...)
          }