Android中的NetworkOnMainThreadException

时间:2012-07-28 10:28:44

标签: android android-emulator android-ndk

我有这个例外。我怎么能用线程概念来做到这一点?

public class WebService extends AsyncTask<String, String, String>{

    private final String NAMESPACE ="http://tempuri.org/";//"http://localhost:9583/YP_Android_WebService/YP_Android_WebService.asmx";//
    private final String URL ="http://10.0.2.2:1243/YP_Android_WebService/YP_Android_WebService.asmx?WSDL";

    public boolean checkUser(String _EmailID, String _Password) {

         boolean result = false; 

        final String SOAP_ACTION ="http://tempuri.org/checkUser";//"http://localhost:9583/YP_Android_WebService/YP_Android_WebService.asmx/checkUserLogin";//
        final String METHOD_NAME = "checkUser";

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        PropertyInfo propertyInfoEmail = new PropertyInfo();
        propertyInfoEmail.setName("_EmailID");
        propertyInfoEmail.setValue(_EmailID);
        propertyInfoEmail.setType(String.class);
        request.addProperty(propertyInfoEmail);

        PropertyInfo propertyInfoPassword = new PropertyInfo();
        propertyInfoPassword.setName("_Password");
        propertyInfoPassword.setValue(_Password);
        propertyInfoPassword.setType(String.class);
        request.addProperty(propertyInfoPassword);

         final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet = true; // put this only if the web service is .NET one
            envelope.setOutputSoapObject(request);
            final HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

        try {


            androidHttpTransport.call(SOAP_ACTION, envelope);
            SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
            Log.i("myApp", response.toString());
            if(response.toString().equalsIgnoreCase("true")){
                result = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

此时就是例外。

  

androidHttpTransport.call(SOAP_ACTION,envelope); ti抛出   NetworkonMainThread Exception。

任何人都可以使用Thread concept

帮助我这样做

4 个答案:

答案 0 :(得分:4)

您没有正确使用Asynctask。你有未实现的方法。您必须使用doInBackground()方法执行所有网络/数据库操作,并且正如@Dirk所说,使用onPostExecute()方法中的UI。

tutorial对于您了解AsyncTasks并了解有关Threads的更多信息也非常有帮助。

答案 1 :(得分:1)

您获得此异常的原因是您尝试在UI线程上执行昂贵的操作,这会显着减慢您的应用程序并导致其强行关闭。您应该将代码包装在AsyncTask(或Thread)中。

阅读本文以获取更多信息:

Why Ice Cream Sandwich Crashes Your App

答案 2 :(得分:0)

您可以使用AsyncTask来解决此问题。在doInBackground()中进行网络连接,在onPostExecute()中进行UI修改。

答案 3 :(得分:0)

你应该使用Asynctask,但是如果你不想简单地添加下面的代码片段(虽然不推荐):

if (android.os.Build.VERSION.SDK_INT > 9) { // disabling strict-mode
                                                    // for newer builds
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }