Java 尝试使用OkHttp3从android应用程序访问webmethod
我尝试使用以下代码创建webmethod,然后使用OkHttp从android应用程序使用它: Web服务托管于http://someaddress.com/HelloWorldJava 尝试使用OkHttp3从android应用程序访问webmethod,java,android,web-services,okhttp3,Java,Android,Web Services,Okhttp3,我尝试使用以下代码创建webmethod,然后使用OkHttp从android应用程序使用它: Web服务托管于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/"
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";
}
}
以上作品,制作代码
AndroidManifest.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>
MainActivity.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();
}
});
}
}
package com.whirlpool.ad.na.gruves1.glisweb;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
导入android.widget.Toast;
导入java.io.IOException;
导入okhttp3.Call;
导入okhttp3.Callback;
导入okhttp3.OkHttpClient;
导入okhttp3.请求;
导入okhttp3.响应;
公共类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
按钮HelloWorldbtn=(按钮)findviewbyd(R.id.btn1);
HelloWorldbtn.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
关于地狱世界(五);
}
});
}
HelloWorld上的公共void(视图v){
OkHttpClient=新的OkHttpClient();
Request Request=newrequest.Builder()
.url(“http://.com/HelloWorld")
.build();
client.newCall(request).enqueue(new Callback()){
@凌驾
公共void onFailure(调用调用,IOE异常){
e、 printStackTrace();
}
@凌驾
public void onResponse(调用调用、响应响应)引发IOException{
Toast Toast=Toast.makeText(getApplicationContext(),“Success”,Toast.LENGTH\u SHORT);
toast.show();
}
});
}
}
我们的目标是使用android应用程序访问Web服务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)
E/AndroidRuntime:致命异常:OkHttp调度程序
流程:glisweb,PID:2749
java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
android.os.Handler.(Handler.java:200)
位于android.os.Handler.(Handler.java:114)
在android.widget.Toast$TN.(Toast.java:345)
在android.widget.Toast.(Toast.java:101)
位于android.widget.Toast.makeText(Toast.java:259)
位于glisweb.MainActivity$2.onResponse(MainActivity.java:54)
在okhttp3.RealCall$AsyncCall.execute(RealCall.java:135)
运行(NamedRunnable.java:32)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
运行(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方法之外引用的变量