首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从JSON获取名称:值对时出错

从JSON获取名称:值对时出错
EN

Stack Overflow用户
提问于 2017-11-11 15:43:14
回答 1查看 58关注 0票数 0

我试图从json字符串中取一个名称:value对。

虽然我犯了错误。我正在使用android和java,并希望取其名称: value对,并将TextView设置为等于该值对。

我认为主要的问题是,我可能不正确地使用了JSON的名称:值对,而且我也可能不正确地更改了TextView。

代码语言:javascript
运行
复制
@Override
public void onResponse(Call call, Response response) throws IOException {
    Log.v("s","--onResponse successfully called.");

    String mmessage = response.body().string();
    Log.v("s", "--Response: " + mmessage);

    try {
        JSONObject json = new JSONObject(mmessage);
        String api_info_balance = json.getString("balance");
        String api_info_pending_charges = json.getString("pending_charges");
        String api_info_last_payment_date = json.getString("last_payment_date");
        String api_info_last_payment_amount = json.getString("last_payment_amount");

         _balancetextview.setText(api_info_balance.toString());
         _pending_chargestextview.setText(api_info_pending_charges.toString());
         _last_payment_datetextview.setText(api_info_last_payment_date.toString());
         _last_payment_amounttextview.setText(api_info_last_payment_amount.toString());
    }catch(Exception e) {
        e.printStackTrace();
        Log.v("s", e.toString());
    }
}

这是返回的json:

{“平衡”:“-23.66”,"pending_charges":"0.00","last_payment_date":"2017-01-27 14:52:13","last_payment_amount":"-50.00"}

逻辑猫:

代码语言:javascript
运行
复制
    [ 11-11 15:34:08.755 16120:16186 D/         ]
                                                                                  SurfaceInterface::setAsyncMode: set async mode 1
11-11 15:34:08.762 16120-16186/com.example.sss.lesdothis D/EGL_emulation: eglMakeCurrent: 0x9c98f8a0: ver 2 0 (tinfo 0xa8a8b7e0)
11-11 15:34:20.640 16120-16120/com.example.sss.lesdothis V/s: --button clicked.
11-11 15:34:22.142 16120-16627/com.example.sss.lesdothis V/s: --onResponse successfully called.
11-11 15:34:22.142 16120-16627/com.example.sss.lesdothis V/s: --Response: {"balance":"-23.66","pending_charges":"0.00","last_payment_date":"2017-01-27 14:52:13","last_payment_amount":"-50.00"}
11-11 15:34:22.143 16120-16627/com.example.sss.lesdothis W/System.err: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
11-11 15:34:22.144 16120-16627/com.example.sss.lesdothis W/System.err:     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7286)
11-11 15:34:22.144 16120-16627/com.example.sss.lesdothis W/System.err:     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1155)
11-11 15:34:22.144 16120-16627/com.example.sss.lesdothis W/System.err:     at android.view.View.requestLayout(View.java:21922)
11-11 15:34:22.145 16120-16627/com.example.sss.lesdothis I/chatty: uid=10082(u0_a82) i.vultr.com/... identical 5 lines
11-11 15:34:22.145 16120-16627/com.example.sss.lesdothis W/System.err:     at android.view.View.requestLayout(View.java:21922)
11-11 15:34:22.145 16120-16627/com.example.sss.lesdothis W/System.err:     at android.support.constraint.ConstraintLayout.requestLayout(ConstraintLayout.java:1959)
11-11 15:34:22.145 16120-16627/com.example.sss.lesdothis W/System.err:     at android.view.View.requestLayout(View.java:21922)
11-11 15:34:22.145 16120-16627/com.example.sss.lesdothis W/System.err:     at android.widget.TextView.checkForRelayout(TextView.java:8526)
11-11 15:34:22.145 16120-16627/com.example.sss.lesdothis W/System.err:     at android.widget.TextView.setText(TextView.java:5392)
11-11 15:34:22.145 16120-16627/com.example.sss.lesdothis W/System.err:     at android.widget.TextView.setText(TextView.java:5248)
11-11 15:34:22.145 16120-16627/com.example.sss.lesdothis W/System.err:     at android.widget.TextView.setText(TextView.java:5205)
11-11 15:34:22.145 16120-16627/com.example.sss.lesdothis W/System.err:     at com.example.sss.lesdothis.MainActivity$1$1.onResponse(MainActivity.java:113)
11-11 15:34:22.146 16120-16627/com.example.sss.lesdothis W/System.err:     at okhttp3.RealCall$AsyncCall.execute(RealCall.java:135)
11-11 15:34:22.146 16120-16627/com.example.sss.lesdothis W/System.err:     at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
11-11 15:34:22.146 16120-16627/com.example.sss.lesdothis W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
11-11 15:34:22.146 16120-16627/com.example.sss.lesdothis W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
11-11 15:34:22.146 16120-16627/com.example.sss.lesdothis W/System.err:     at java.lang.Thread.run(Thread.java:764)
11-11 15:34:22.146 16120-16627/com.example.sss.lesdothis V/s: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
11-11 15:34:22.146 16120-16627/com.example.sss.lesdothis V/s: --pgld1
EN

回答 1

Stack Overflow用户

发布于 2017-11-11 15:48:19

您应该只在堆栈跟踪状态下从ui线程更新ui。如果您在一个活动中,可以通过调用runOnUiThread方法来做到这一点:

代码语言:javascript
运行
复制
runOnUiThread(new Runnable() {
@Override
public void run() {
    _balancetextview.setText(api_info_balance.toString());
    _pending_chargestextview.setText(api_info_pending_charges.toString());
    _last_payment_datetextview.setText(api_info_last_payment_date.toString());
    _last_payment_amounttextview.setText(api_info_last_payment_amount.toString());
}
});

基本上,只需将UI更新封装在对此方法的调用中,它就不会再崩溃了。如果你想知道更多的话,这是链接到文档

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47239718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档