从api获取数据后,数据未显示在应用中

时间:2020-02-22 07:17:23

标签: java android android-recyclerview

我试图从我的应用程序中的api获取数据,但是即使我在单独的UI线程中执行基于服务器的操作,它也会在下面显示响应。为什么我的数据没有显示

以下是我在邮递员中的json响应:

a, b = (1, 2) # implies a == 1, and b == 2
# similarly,
a, b = ([('x', 2), ('m', 3), ('n', 1)], 'a')
       -------------------------------  ---
                1st elem of tuple     2nd elem
# implies a == [('x', 2), ('m', 3), ('n', 1)] and b == 'a'
>>> sorted(a, key = lambda x:x[1])
[('n', 1), ('x', 2), ('m', 3)]
>>> sorted(a, key = lambda x:x[1]),  b
  ( [('n', 1), ('x', 2), ('m', 3)], 'a' )

运行我的应用时,下面显示错误:

 [
{
    "term_id": "4",
    "name": "Entertainment"
},
{
    "term_id": "5",
    "name": "Tech & Gadgets"
},
{
    "term_id": "6",
    "name": "Sports"
},
{
    "term_id": "7",
    "name": "Health and Fitness Tips"
}
]

下面是我的代码:

2020-02-22 12:40:55.881 16118-16118/com.example.flypped E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.flypped, PID: 16118
android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
    at com.android.org.conscrypt.Platform.blockGuardOnNetwork(Platform.java:415)
    at com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(ConscryptFileDescriptorSocket.java:560)
    at okio.InputStreamSource.read(Okio.kt:102)
    at okio.AsyncTimeout$source$1.read(AsyncTimeout.kt:159)
    at okio.RealBufferedSource.request(RealBufferedSource.kt:62)
    at okio.RealBufferedSource.require(RealBufferedSource.kt:55)
    at okio.RealBufferedSource.readHexadecimalUnsignedLong(RealBufferedSource.kt:299)
    at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.readChunkSize(Http1ExchangeCodec.kt:450)
    at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.read(Http1ExchangeCodec.kt:429)
    at okhttp3.internal.connection.Exchange$ResponseBodySource.read(Exchange.kt:279)
    at okio.RealBufferedSource.select(RealBufferedSource.kt:93)
    at okhttp3.internal.Util.readBomAsCharset(Util.kt:256)
    at okhttp3.ResponseBody.string(ResponseBody.kt:187)
    at com.example.flypped.MainActivity$3$1.run(MainActivity.java:241)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7156)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
    Suppressed: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
    at com.android.org.conscrypt.Platform.blockGuardOnNetwork(Platform.java:415)
    at com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(ConscryptFileDescriptorSocket.java:560)
    at okio.InputStreamSource.read(Okio.kt:102)
    at okio.AsyncTimeout$source$1.read(AsyncTimeout.kt:159)
    at okio.RealBufferedSource.request(RealBufferedSource.kt:62)
    at okio.RealBufferedSource.require(RealBufferedSource.kt:55)
    at okio.RealBufferedSource.readHexadecimalUnsignedLong(RealBufferedSource.kt:299)
    at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.readChunkSize(Http1ExchangeCodec.kt:450)
    at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.read(Http1ExchangeCodec.kt:429)
    at okhttp3.internal.Util.skipAll(Util.kt:337)
    at okhttp3.internal.Util.discard(Util.kt:358)
    at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.close(Http1ExchangeCodec.kt:471)
    at okio.ForwardingSource.close(ForwardingSource.kt:34)
    at okhttp3.internal.connection.Exchange$ResponseBodySource.close(Exchange.kt:306)
    at okio.RealBufferedSource.close(RealBufferedSource.kt:461)
    at kotlin.io.CloseableKt.closeFinally(Closeable.kt:56)
    at okhttp3.ResponseBody.string(ResponseBody.kt:186)
            ... 8 more

即使我在单独的UI线程中使用netwoek操作,为什么也会显示此错误。请让我知道我做错了什么,我们将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:1)

您遇到的问题是因为您试图在主线程上执行网络操作。

如果查看堆栈跟踪的第一行,您会看到:

进程:com.example.flypped,PID:16118 android.os.NetworkOnMainThreadException

要解决此问题,您可以在AsyncTask内运行代码。

注意:Android R中已弃用

private class TestTask extends AsyncTask<YOUR PARAMETERS> {

  protected Long doInBackground(Params) {
     //Your logic
 }

 protected void onProgressUpdate(Integer... progress) {
    //Update progress
 }

 protected void onPostExecute(Long result) {

 }
}

要执行AsyncTask,请编写:

new TestTask().execute(YOUR_PARAMS);