我使用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
答案 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()。