【问题标题】:How to use loopj get in Android Widget如何在 Android Widget 中使用 loopj get
【发布时间】:2017-09-17 01:28:47
【问题描述】:

我正在尝试将 json http 请求与 Widget 一起使用,但没有任何反应,只是控制台上的一条消息

D/dalvikvm: GC_CONCURRENT freed 366K, 5% free 10713K/11207K, paused 5ms+30ms V/AsyncHttpRH:从 121 进步 183 (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));
}

【问题讨论】:

    标签: android android-widget loopj


    【解决方案1】:

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

    因为client.get() 是一个异步调用,它会立即执行并转到返回语句。这就是为什么您看不到任何变化的原因,因为 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(...)
              }
    

    【讨论】:

    • onSuccess() 无效,无法重新调整字符串
    • @user1801745 抱歉,是的,您需要实现回调。检查更新的答案。
    • 仍然无法正常工作,AsyncTask 类的更改 loopj 并在我的设备上工作,而不是在模拟器中(D/dalvikvm:GC_CONCURRENT 释放 366K,5% 空闲 10713K/11207K,暂停 5ms+30ms V/AsyncHttpRH : 从 121 进步 183 (151%)) 小部件的进程似乎很多......!?
    猜你喜欢
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多