我想编写一个非常简单的API。 当我使用邮递员API的作品。 我想创建android应用,但是我的应用崩溃了。为什么? 错误在哪里
OkHttpClient zapytanie = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("login", "some_email")
.add("password", "some_password")
.build();
final Request request = new Request.Builder()
.header("Content-Type", "application/x-www-form-urlencoded")
.url("https://garlic-dragon.000webhostapp.com/registration.php")
.post(requestBody)
.build();
try {
Response response = zapytanie.newCall(request).execute();
Toast.makeText(getApplicationContext(), "This is my success!",
Toast.LENGTH_LONG).show();
} catch (IOException e) {
//e.printStackTrace();
Toast.makeText(getApplicationContext(), e.toString(),
Toast.LENGTH_LONG).show();
}
2019-12-07 19:32:56.007 28055-28055 / com.example.chat E / AndroidRuntime: 致命异常:主要 流程:com.example.chat,PID:28055 android.os.NetworkOnMainThreadException 在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513) 在java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:117) 在java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105) 在java.net.InetAddress.getAllByName(InetAddress.java:1154) 在okhttp3.Dns $ Companion $ SYSTEM $ 1.lookup(Dns.kt:48) 在okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.kt:160) 在okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.kt:125) 在okhttp3.internal.connection.RouteSelector.next(RouteSelector.kt:71) 在okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:199) 在okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:109) 在okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:77) 在okhttp3.internal.connection.Transmitter.newExchange $ okhttp(Transmitter.kt:162) 在okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:35) 在okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112) 在okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87) 在okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:82) 在okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112) 在okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87) 在okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:84) 在okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112) 在okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:71) 在okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112) 在okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87) 在okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:184) 在okhttp3.RealCall.execute(RealCall.kt:66) 在com.example.a4.MainActivity $ 2.onClick(MainActivity.java:78) 在android.view.View.performClick(View.java:7339) 在android.widget.TextView.performClick(TextView.java:14222) 在android.view.View.performClickInternal(View.java:7305) 在android.view.View.access $ 3200(View.java:846) 在android.view.View $ PerformClick.run(View.java:27787) 在android.os.Handler.handleCallback(Handler.java:873) 在android.os.Handler.dispatchMessage(Handler.java:99) 在android.os.Looper.loop(Looper.java:214) 在android.app.ActivityThread.main(ActivityThread.java:7078) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
答案 0 :(得分:0)
错误必须为NetworkOnMainThreadException
,这是因为无法在主线程上执行同步HTTP。使用入队不执行
异步运行请求。
OkHttpClient zapytanie = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("login", "some_email")
.add("password", "some_password")
.build();
final Request request = new Request.Builder()
.header("Content-Type", "application/x-www-form-urlencoded")
.url("https://garlic-dragon.000webhostapp.com/registration.php")
.post(requestBody)
.build();
try {
Response response = zapytanie.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, Throwable throwable) {
// Something went wrong
}
@Override public void onResponse(Response response) throws IOException {
if (response.isSuccessful()) {
// Do what you want to do with the response.
} else {
// Request not successful
}
}
});
} catch (IOException e) {
//e.printStackTrace();
Toast.makeText(getApplicationContext(), e.toString(),
Toast.LENGTH_LONG).show();
}
我建议使用Retrofit之类的库,以简化API调用。