runOnUiThread有时不起作用-为什么?

时间:2019-07-15 09:30:07

标签: android android-runonuithread

我使用OkHttpClient从服务器获取数据并在runOnUiThread事件中显示,但该事件并不总是有效

基本逻辑是我点击一个按钮,OkHttpClient从服务器获取一个json,对其进行解析并向我显示json数据。不知道为什么,有时它可以正常工作,但在更多情况下,我需要点击几次以使其正常工作。我测试并发现json数据总是总是成功获取的,所以问题似乎在于runOnUiThread事件没有以适当的方式触发吗?抱歉,我是android新手

private void getDocDetail() {
    OkHttpClient client = new OkHttpClient.Builder().build();
    RequestBody post = new FormBody.Builder()
                .add("DocTypeID", Integer.toString(DocTypeID))
                .add("DocID", Integer.toString(DocID))
                .build();

    final Request req = new Request.Builder()
                .url("http://127.0.0.1/GetDocData.php"))
                .post(post)
                .build();

    client.newCall(req).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, final Response response) throws IOException {
            runOnUiThread(new Runnable() {
            @Override
            public void run() {
                try {
                    final String s = response.body().string();
                    JSONObject jo = new JSONObject(s);
                    AttachCount = jo.optInt("Attach");
                    edtAttach.setText(String.valueOf(AttachCount));
                } catch (JSONException e) { e.printStackTrace(); }
                        catch (IOException e) { e.printStackTrace(); }
                        catch (Exception e) { e.printStackTrace(); }
            });
            }
    });
}

完全没有错误消息。我需要的是,每次点击按钮时,我都能正确看到AttachCount,而不是点击10次而只有1次有效

工作正常时,日志非常简单,如下所示:

  

2019-07-16 10:56:16.553 13332-13332 / com.example.lance.platform   I /时间轴:

     

时间轴:Activity_launch_request时间:5633500 intent:Intent {   cmp = com.example.lance.platform / .DocsignActivity(有其他功能)}

     

2019-07-16 10:56:16.624 13332-13379 / com.example.lance.platform   I / ContentCatcher:ViewContentFetcher:ViewContentFetcher

     

2019-07-16 10:56:17.093 13332-13337 / com.example.lance.platform   I / zygote64:执行完整的代码缓存收集,代码= 481KB,数据= 346KB

     

2019-07-16 10:56:17.095 13332-13337 / com.example.lance.platform   I / zygote64:收集代码缓存后,代码= 470KB,数据= 294KB

     

但是,如果我轻按却没有任何反应,则日志如下所示:

     

2019-07-16 10:48:14.443 12870-12870 / com.example.lance.platform   I /时间轴:时间轴:Activity_launch_request时间:5151391   intent:Intent {cmp = com.example.lance.platform / .DocsignActivity(has   额外内容)}

     

2019-07-16 10:48:14.554 12870-12896 / com.example.lance.platform   D / ViewContentFactory:initViewContentFetcherClass

     

2019-07-16 10:48:14.554 12870-12896 / com.example.lance.platform   I / ContentCatcher:ViewContentFetcher:ViewContentFetcher

     

2019-07-16 10:48:14.554 12870-12896 / com.example.lance.platform   D / ViewContentFactory:createInterceptor用了1ms

     

2019-07-16 10:48:14.810 12870-12875 / com.example.lance.platform   I / zygote64:编译器分配了7MB的空间来编译void   android.widget.TextView。((android.content.Context,   android.util.AttributeSet,int,int)

     

2019-07-16 10:48:14.845 12870-12870 / com.example.lance.platform   W / Looper:慢帧:doFrame迟了318ms

     

2019-07-16 10:48:15.065 12870-12870 / com.example.lance.platform   W / System.err:android.os.NetworkOnMainThreadException

     

2019-07-16 10:48:15.066 12870-12870 / com.example.lance.platform   W / System.err:位于   android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1450)

     

2019-07-16 10:48:15.066 12870-12870 / com.example.lance.platform   W / System.err:位于   java.net.SocketInputStream.read(SocketInputStream.java:169)

     

2019-07-16 10:48:15.066 12870-12870 / com.example.lance.platform   W / System.err:位于   java.net.SocketInputStream.read(SocketInputStream.java:139)

     

2019-07-16 10:48:15.066 12870-12870 / com.example.lance.platform   W / System.err:在okio.Okio $ 2.read(Okio.java:139)

     

2019-07-16 10:48:15.067 12870-12870 / com.example.lance.platform   W / System.err:在okio.AsyncTimeout $ 2.read(AsyncTimeout.java:237)

     

2019-07-16 10:48:15.067 12870-12870 / com.example.lance.platform   W / System.err:位于   okio.RealBufferedSource.read(RealBufferedSource.java:46)

     

2019-07-16 10:48:15.067 12870-12870 / com.example.lance.platform   W / System.err:位于   okhttp3.internal.http1.Http1Codec $ FixedLengthSource.read(Http1Codec.java:384)

     

2019-07-16 10:48:15.067 12870-12870 / com.example.lance.platform   W / System.err:位于okhttp3.internal.Util.skipAll(Util.java:171)

     

2019-07-16 10:48:15.067 12870-12870 / com.example.lance.platform   W / System.err:位于okhttp3.internal.Util.discard(Util.java:153)

     

2019-07-16 10:48:15.067 12870-12870 / com.example.lance.platform   W / System.err:位于   okhttp3.internal.http1.Http1Codec $ FixedLengthSource.close(Http1Codec.java:400)

     

2019-07-16 10:48:15.067 12870-12870 / com.example.lance.platform   W / System.err:位于   okio.RealBufferedSource.close(RealBufferedSource.java:455)

     

2019-07-16 10:48:15.068 12870-12870 / com.example.lance.platform   W / System.err:位于okhttp3.internal.Util.closeQuietly(Util.java:106)

     

2019-07-16 10:48:15.068 12870-12870 / com.example.lance.platform   W / System.err:位于   okhttp3.ResponseBody.string(ResponseBody.java:177)

     

2019-07-16 10:48:15.068 12870-12870 / com.example.lance.platform   W / System.err:位于   com.example.lance.platform.DocsignActivity $ 1 $ 1.run(DocsignActivity.java:229)

     

2019-07-16 10:48:15.068 12870-12870 / com.example.lance.platform   W / System.err:位于   android.os.Handler.handleCallback(Handler.java:794)

     

2019-07-16 10:48:15.068 12870-12870 / com.example.lance.platform   W / System.err:位于   android.os.Handler.dispatchMessage(Handler.java:99)

     

2019-07-16 10:48:15.068 12870-12870 / com.example.lance.platform   W / System.err:位于android.os.Looper.loop(Looper.java:176)

     

2019-07-16 10:48:15.068 12870-12870 / com.example.lance.platform   W / System.err:位于   android.app.ActivityThread.main(ActivityThread.java:6651)

     

2019-07-16 10:48:15.069 12870-12870 / com.example.lance.platform   W / System.err:位于java.lang.reflect.Method.invoke(本机方法)

     

2019-07-16 10:48:15.069 12870-12870 / com.example.lance.platform   W / System.err:位于   com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:547)

     

2019-07-16 10:48:15.069 12870-12870 / com.example.lance.platform   W / System.err:位于   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

     

2019-07-16 10:48:15.098 12870-12898 / com.example.lance.platform   D / OpenGLRenderer:0x6fd8b62000(ListView)上的endAllActiveAnimators   手柄为0x6fd8ac0460

1 个答案:

答案 0 :(得分:0)

此代码有问题。

   final String s = response.body().string();

如日志所示,

2019-07-16 10:48:15.068 12870-12870/com.example.lance.platform W/System.err: at okhttp3.ResponseBody.string(ResponseBody.java:177)

很有可能没有完全收到网络响应,这将调用网络套接字获取最终将在UI线程上变为网络的内容。

解决方案是创建一个成员变量mString并在onResponse中进行设置:

public void onResponse(Call call, final Response response) throws IOException 
{
    mString = response.body().string();

在runOnUiThread中,使用此mString代替response.body()。string()。