使用API REST接口在android应用程序上验证用户



我正在和朋友们一起编写一个使用API登录的应用程序。我正在使用OKHTTP进行GET/POST请求。我已经为登录页面写了以下代码:

private void loginpage() {
final Button button = findViewById(R.id.button4);
button.setOnClickListener(v -> {
String username = findViewById(R.id.editTextTextPassword).toString();
String password = findViewById(R.id.editTextTextPersonName).toString();
try {
webUntisAPI.login(username,password,"Spengergasse"); //Accesses the API to login
setContentView(R.layout.activity_main);
mainpage();
}catch (RuntimeException ignored){
//On fail don't switch view
}
});
}

尝试登录后,我收到以下错误消息

W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1600)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:115)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
at java.net.InetAddress.getAllByName(InetAddress.java:1152)
at okhttp3.Dns$Companion$DnsSystem.lookup(Dns.kt:49)
at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.kt:164)
at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.kt:129)
at okhttp3.internal.connection.RouteSelector.next(RouteSelector.kt:71)
at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:205)
at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)
W/System.err:     at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)
at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)
W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)
at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)
at okhttp3.internal.connection.RealCall.execute(RealCall.kt:154)
W/System.err:     at com.example.myapplication.WebUntisAPI.login(WebUntisAPI.java:49)
at com.example.myapplication.MainActivity.lambda$loginpage$0$MainActivity(MainActivity.java:56)
at com.example.myapplication.-$$Lambda$MainActivity$f4xelUsFrwZaMU-fM7MXdfynjRQ.onClick(Unknown Source:2)
at android.view.View.performClick(View.java:7448)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
at android.view.View.performClickInternal(View.java:7425)
W/System.err:     at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28296)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
I/Choreographer: Skipped 33 frames!  The application may be doing too much work on its main thread.

我尝试过多线程,但没有找到等待登录结果的解决方案。关于错误消息开头的Strict Mode错误,我在MainActivity类的onCreate((方法中添加了以下几行:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

如果你能帮我找到解决方案,我将不胜感激!非常感谢。

应用程序可能在其主线程上做了太多工作

这个错误意味着你不能在主线程中运行api调用,它只用于更新UI。

您的setContentView(R.layout.activity_main(;应该在OnCreate中,而不是在此处。这应该先运行。

在设置了UI之后,您应该在协同程序中运行API

此外,请尝试使用改装作为其推荐库由谷歌api调用

运行api调用的最佳实践是使用协程,这将使您的应用程序更快,我建议您学习它,它很棒,易于理解(值得(。这里有一个学习的环节https://zaidzakir.medium.com/coroutines-in-android-explained-8f00a37c8528

最新更新