我正在尝试使用以下代码创建一个网络方法,然后使用 OkHttp 从 android 应用程序中使用它:
网络服务托管在 http://someaddress.com/HelloWorld
using GLS.GLIS.Core;
using System.IO;
using GLS.GLIS.ApplicationServices.Settings;
namespace GLS.GLIS.Web.Ax
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class Wireless : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}
以上作品,生产代码
安卓清单.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.whirlpool.ad.na.gruves1.glisweb">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
</manifest>
主活动.java
package com.whirlpool.ad.na.gruves1.glisweb;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button HelloWorldbtn = (Button) findViewById(R.id.btn1);
HelloWorldbtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onHelloWorld(v);
}
});
}
public void onHelloWorld (View v) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://<someaddress>.com/HelloWorld")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Toast toast = Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_SHORT);
toast.show();
}
});
}
}
目标是使用Android应用程序点击网络服务HelloWorld和onResponse,祝酒"成功"。我的目标是在未来的迭代中在此基础上构建并利用更多的 Web 服务。但是,以下内容不断返回各种错误,搜索时,这些错误不会返回与我的问题相关的解决方案。目前我能想到的最好的是,这可能是一个活动问题。破坏代码并遵循堆栈跟踪也不会返回任何对我来说突出的内容。任何帮助将不胜感激。提前谢谢。
更新
以下是我在模拟器中运行时遇到的错误:
E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
Process: glisweb, PID: 2749
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at android.widget.Toast$TN.<init>(Toast.java:345)
at android.widget.Toast.<init>(Toast.java:101)
at android.widget.Toast.makeText(Toast.java:259)
at glisweb.MainActivity$2.onResponse(MainActivity.java:54)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:135)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
这花了我相当多的实验和闲逛,但我终于找到了这个错误的解决方案。此解决方案的要点是,您应该小心在 newCall 函数中的 onFailure 和 onResponse 方法中放入哪些代码。例如:
@Override
public void onResponse(Call call, Response response) throws IOException {
Toast toast = Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_SHORT);
toast.show();
}
在 onResponse 中,使用 toast.show(( 函数会抛出我看到的特定错误。我相信这与Android使用的视图有关。只需删除此代码并将其替换为可在 onResponse 方法外部引用的变量。