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));
}
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 thevalue
is still 0. Put the return insideonSuccess()
. You also need to return a value fromonFailure()
.Edit
Since onSuccess is void, you need to pass in a callback which will be called after the parsing.
Then,
Inside getCurrentPrice (don't return the value) -