我有这个例外。我怎么能用线程概念来做到这一点?
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
帮助我这样做答案 0 :(得分:4)
您没有正确使用Asynctask
。你有未实现的方法。您必须使用doInBackground()
方法执行所有网络/数据库操作,并且正如@Dirk所说,使用onPostExecute()
方法中的UI。
此tutorial对于您了解AsyncTasks
并了解有关Threads
的更多信息也非常有帮助。
答案 1 :(得分:1)
您获得此异常的原因是您尝试在UI线程上执行昂贵的操作,这会显着减慢您的应用程序并导致其强行关闭。您应该将代码包装在AsyncTask
(或Thread
)中。
阅读本文以获取更多信息:
答案 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);
}