webservice(ksoap)的android.os.NetworkOnMainThreadException [英] android.os.NetworkOnMainThreadException for webservice (ksoap)

查看:318
本文介绍了webservice(ksoap)的android.os.NetworkOnMainThreadException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很喜欢android编程,并试图在这个示例程序中使用webservice:



我使用Android 4.1,我的IDE是Eclipse Juno。我认为编程的一部分是确定的,但可能是连接有问题。

  package com.example.webserviceexample; 

import java.io.IOException;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

final static String NAMESPACE =http://tempuri.org/;
final static String METHOD_NAME =CelsiusToFahrenheit;
final static String SOAP_ACTION =http://tempuri.org/CelsiusToFahrenheit;
final static String URL =http://www.w3schools.com/webservices/tempconvert.asmx;

TextView sonuc;
EditText deger;
按钮hesapla;

@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

deger =(EditText)findViewById(R.id.deger);
sonuc =(TextView)findViewById(R.id.flag);
hesapla =(Button)findViewById(R.id.hesapla);

hesapla.setOnClickListener(new OnClickListener(){

public void onClick(View v){

//请求信息
SoapObject Request = new SoapObject(NAMESPACE,METHOD_NAME);
Request.addProperty(Celcius,deger.getText()。toString());

//信封
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet = true; //.NET = true,php = false

//向信封发送请求
soapEnvelope。 setOutputSoapObject(Request);

//传输数据
HttpTransportSE aht = new HttpTransportSE(URL); //准备
// start
try {
aht.call(SOAP_ACTION,soapEnvelope);
}
catch(IOException e){
e.printStackTrace();
}
catch(XmlPullParserException e)
{
e.printStackTrace();
}

//等待并获得响应。
字符串结果;

try {
//我们正在创建SoapPrimitive Object等待简单变量。
result =Fahrenheit:+ soapEnvelope.getResponse();

//将结果写入textView
sonuc.setText(result);
}
catch(SoapFault e){
e.printStackTrace();
}

}
});
}

@Override
public boolean onCreateOptionsMenu(菜单菜单){
getMenuInflater()。inflate(R.menu.activity_main,menu);
返回true;
}
}

但是,我收到这个错误:

  08-15 11:45:26.294:E / AndroidRuntime(641):FATAL EXCEPTION:main 
08-15 11:45 :26.294:E / AndroidRuntime(641):android.os.NetworkOnMainThreadException
08-15 11:45:26.294:E / AndroidRuntime(641):android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java: 1117)
08-15 11:45:26.294:E / AndroidRuntime(641):java.net.InetAddress.lookupHostByName(InetAddress.java:385)
08-15 11:45:26.294: E / AndroidRuntime(641):在java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
08-15 11:45:26.294:E / AndroidRuntime(641):在java.net.InetAddress.getAllByName (InetAddress.java:214)
08-15 11:45:26.294:E / AndroidRuntime(641):在libcore.net.http.HttpConnection。< init>(HttpConnection.java:70)
08-15 11:45:26.294:E / AndroidRuntime(641):在libcore.net.http.HttpConnection。< init>(HttpConnection.java:50)
08-15 11:45:26.294: E / AndroidRun时间(641):在libcore.net.http.HttpConnection $ Address.connect(HttpConnection.java:341)
08-15 11:45:26.294:E / AndroidRuntime(641):在libcore.net.http .HttpConnectionPool.get(HttpConnectionPool.java:87)
08-15 11:45:26.294:E / AndroidRuntime(641):在libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
08-15 11:45:26.294:E / AndroidRuntime(641):在libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
08-15 11:45:26.294:E / AndroidRuntime(641):在libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
08-15 11:45:26.294:E / AndroidRuntime(641):在libcore.net.http.HttpEngine .sendSocketRequest(HttpEngine.java:289)
08-15 11:45:26.294:E / AndroidRuntime(641):在libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
08-15 11:45:26.294:E / AndroidRuntime(641):在libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
08-15 11:45:26.294:E / AndroidRuntime 641):在org.ksoap2.transport.ServiceCo nnectionSE.connect(ServiceConnectionSE.java:76)
08-15 11:45:26.294:E / AndroidRuntime(641):在org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:146)
08-15 11:45:26.294:E / AndroidRuntime(641):在org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)
08-15 11:45:26.294:E / AndroidRuntime (641):at com.example.webserviceexample.MainActivity $ 1.onClick(MainActivity.java:61)
08-15 11:45:26.294:E / AndroidRuntime(641):在android.view.View.performClick (View.java:4084)
08-15 11:45:26.294:E / AndroidRuntime(641):在android.view.View $ PerformClick.run(View.java:16966)
08- 15 11:45:26.294:E / AndroidRuntime(641):android.os.Handler.handleCallback(Handler.java:615)
08-15 11:45:26.294:E / AndroidRuntime(641):at android.os.Handler.dispatchMessage(Handler.java:92)
08-15 11:45:26.294:E / AndroidRuntime(641):android.os.Looper.loop(Looper.java:137)
08-15 11:45:26.294:E / AndroidRuntime(641):android.app.ActivityThread.main (ActivityThread.java:4745)
08-15 11:45:26.294:E / AndroidRuntime(641):java.lang.reflect.Method.invokeNative(Native Method)
08-15 11: 45:26.294:E / AndroidRuntime(641):在java.lang.reflect.Method.invoke(Method.java:511)
08-15 11:45:26.294:E / AndroidRuntime(641):at com .android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
08-15 11:45:26.294:E / AndroidRuntime(641):在com.android.internal.os.ZygoteInit。 main(ZygoteInit.java:553)
08-15 11:45:26.294:E / AndroidRuntime(641):at dalvik.system.NativeStart.main(Native Method)

那么可能是什么问题?

解决方案

您不能在主线程上执行网络操作。
结帐: http://developer.android.com/reference/ android / os / AsyncTask.html



无痛背景线程:)



编辑:我仍然得到这个答案的投票,即使这是几年,我不再建议使用AsyncTask。这里有许多已知的问题( http ://blog.danlew.net/2014/06/21/the-hidden-pitfalls-of-asynctask/ )。相反,我会敦促你使用Retrofit或其他一些很好的http客户端来处理线程。


I am new to android programming and trying to use webservice in this sample program:

I use Android 4.1 and my IDE is Eclipse Juno. I think the programming part is ok, but may be there is a problem about connecting.

package com.example.webserviceexample;

import java.io.IOException;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    final static String NAMESPACE = "http://tempuri.org/";
    final static String METHOD_NAME = "CelsiusToFahrenheit";
    final static String SOAP_ACTION = "http://tempuri.org/CelsiusToFahrenheit";
    final static String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";

    TextView sonuc;
    EditText deger;
    Button hesapla;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        deger = (EditText) findViewById(R.id.deger);
        sonuc = (TextView) findViewById(R.id.flag);
        hesapla = (Button) findViewById(R.id.hesapla);

        hesapla.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                //request info
                SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
                Request.addProperty("Celcius",deger.getText().toString());

                //envelope
                SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                soapEnvelope.dotNet = true; //.NET = true, php = false

                //putting request to the envelope
                soapEnvelope.setOutputSoapObject(Request);

                //transferring data
                HttpTransportSE aht = new HttpTransportSE(URL); //prepare
                //start
                try {
                        aht.call(SOAP_ACTION, soapEnvelope);
                } 
                catch (IOException e) {
                    e.printStackTrace();
                }
                catch (XmlPullParserException e)
                {
                    e.printStackTrace();
                }

                //waiting and getting response.
                String result;

                try {
                    // we are creating SoapPrimitive Object as waiting for simple variable.
                    result = "Fahrenheit:" + soapEnvelope.getResponse();

                    //writing the result to the textView
                    sonuc.setText(result);
                }
                catch (SoapFault e) {
                    e.printStackTrace();
                }

            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

However, I get this error:

08-15 11:45:26.294: E/AndroidRuntime(641): FATAL EXCEPTION: main
08-15 11:45:26.294: E/AndroidRuntime(641): android.os.NetworkOnMainThreadException
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
08-15 11:45:26.294: E/AndroidRuntime(641):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
08-15 11:45:26.294: E/AndroidRuntime(641):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
08-15 11:45:26.294: E/AndroidRuntime(641):  at java.net.InetAddress.getAllByName(InetAddress.java:214)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:341)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
08-15 11:45:26.294: E/AndroidRuntime(641):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
08-15 11:45:26.294: E/AndroidRuntime(641):  at org.ksoap2.transport.ServiceConnectionSE.connect(ServiceConnectionSE.java:76)
08-15 11:45:26.294: E/AndroidRuntime(641):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:146)
08-15 11:45:26.294: E/AndroidRuntime(641):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)
08-15 11:45:26.294: E/AndroidRuntime(641):  at com.example.webserviceexample.MainActivity$1.onClick(MainActivity.java:61)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.view.View.performClick(View.java:4084)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.view.View$PerformClick.run(View.java:16966)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.os.Handler.handleCallback(Handler.java:615)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.os.Handler.dispatchMessage(Handler.java:92)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.os.Looper.loop(Looper.java:137)
08-15 11:45:26.294: E/AndroidRuntime(641):  at android.app.ActivityThread.main(ActivityThread.java:4745)
08-15 11:45:26.294: E/AndroidRuntime(641):  at java.lang.reflect.Method.invokeNative(Native Method)
08-15 11:45:26.294: E/AndroidRuntime(641):  at java.lang.reflect.Method.invoke(Method.java:511)
08-15 11:45:26.294: E/AndroidRuntime(641):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-15 11:45:26.294: E/AndroidRuntime(641):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-15 11:45:26.294: E/AndroidRuntime(641):  at dalvik.system.NativeStart.main(Native Method)

So what can be the problem?

解决方案

You can't do Network operations on the main thread. Checkout : http://developer.android.com/reference/android/os/AsyncTask.html

for painless background threading :)

EDIT: Since I am still getting up-votes for this answer even though it's several years old I would no longer suggest using AsyncTask. It has many known problems which are described here (http://blog.danlew.net/2014/06/21/the-hidden-pitfalls-of-asynctask/). Instead I would urge you to use Retrofit or one of the other nice http clients which handles the threading for you.

这篇关于webservice(ksoap)的android.os.NetworkOnMainThreadException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆