调用 webservice 时出现致命异常 AsyncTask3 错误
Fatal Exception AsyncTask3 error while calling webservice
我正在尝试调用网络服务并将返回值设置为来自服务的 textview。但是当我点击按钮时,我得到了那个致命的异常错误。我的错误在哪里?
Java代码:`
public class Login extends Activity {
private String SOAP_ACTION = "http://appointmentsystem.somee.com/HelloWorld";
private String METHOD_NAME = "HelloWorld";
private String NAMESPACE = "http://appointmentsystem.somee.com/";
private String URL = "http://appointmentsystem.somee.com/Service1.asmx";
private SoapObject request = null;
private SoapSerializationEnvelope envelope;
private HttpTransportSE androidHttpTransport;
private SoapPrimitive response;
private EditText loginEdtUser, loginEdtPassword;
private Button loginBtnEnter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
loginEdtUser = (EditText) findViewById(R.id.loginEdtUser);
loginEdtPassword = (EditText) findViewById(R.id.loginEdtPassword);
loginBtnEnter = (Button) findViewById(R.id.loginBtnEnter);
loginBtnEnter.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AsyncCallWS task = new AsyncCallWS();
task.execute();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.login, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Login();
return null;
}
@Override
protected void onPostExecute(Void result) {
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
public void Login() {
try {
request = new SoapObject(NAMESPACE, METHOD_NAME);
envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug = true;
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
response = (SoapPrimitive) envelope.getResponse();
loginEdtUser.setText(response.toString());
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
Toast.LENGTH_SHORT).show();
}
}
错误:
{02-28 11:31:16.935: E/AndroidRuntime(4489): FATAL EXCEPTION: AsyncTask #3
02-28 11:31:16.935: E/AndroidRuntime(4489): Process: oziylmz.randevusistemi, PID: 4489
02-28 11:31:16.935: E/AndroidRuntime(4489): java.lang.RuntimeException: An error occured while executing doInBackground()
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.os.AsyncTask.done(AsyncTask.java:300)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.lang.Thread.run(Thread.java:841)
02-28 11:31:16.935: E/AndroidRuntime(4489): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.os.Handler.<init>(Handler.java:200)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.os.Handler.<init>(Handler.java:114)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.widget.Toast$TN.<init>(Toast.java:351)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.widget.Toast.<init>(Toast.java:101)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.widget.Toast.makeText(Toast.java:265)
02-28 11:31:16.935: E/AndroidRuntime(4489): at oziylmz.randevusistemi.Login.Login(Login.java:109)
02-28 11:31:16.935: E/AndroidRuntime(4489): at oziylmz.randevusistemi.Login$AsyncCallWS.doInBackground(Login.java:69)
02-28 11:31:16.935: E/AndroidRuntime(4489): at oziylmz.randevusistemi.Login$AsyncCallWS.doInBackground(Login.java:1)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.os.AsyncTask.call(AsyncTask.java:288)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.FutureTask.run(FutureTask.java:237)}
您收到以下错误:
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
这意味着您已尝试在后台更改 UI
,因为我看到您的代码,您已尝试 Toast
数据捕获 login
方法。
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
response = (SoapPrimitive) envelope.getResponse();
loginEdtUser.setText(response.toString());
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
Toast.LENGTH_SHORT).show();
}
您无法在后台线程中更新 UI
,您必须在 onPostExecute
中处理错误或创建 Handler
对象并使用它。
您可以通过以下方式解决您的问题:
1- runOnUiThread Example
2-处理程序
3- 移动到 onPostExecute。
有关详细信息,请参阅以下文章:
Android background processing with Handlers, AsyncTask and Loaders - Tutorial
Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
Toast.LENGTH_SHORT).show();
这会导致异常,因为您无法在后台处理中触摸 ui 个元素。
修复:
在异步任务的 onPostexecute() 方法中制作 toast,而不是在 UI thread
上执行
您想使用
runOnUiThread(new Runnable() {
@Override
public void run() {
Login();
}
});
我正在尝试调用网络服务并将返回值设置为来自服务的 textview。但是当我点击按钮时,我得到了那个致命的异常错误。我的错误在哪里?
Java代码:`
public class Login extends Activity {
private String SOAP_ACTION = "http://appointmentsystem.somee.com/HelloWorld";
private String METHOD_NAME = "HelloWorld";
private String NAMESPACE = "http://appointmentsystem.somee.com/";
private String URL = "http://appointmentsystem.somee.com/Service1.asmx";
private SoapObject request = null;
private SoapSerializationEnvelope envelope;
private HttpTransportSE androidHttpTransport;
private SoapPrimitive response;
private EditText loginEdtUser, loginEdtPassword;
private Button loginBtnEnter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
loginEdtUser = (EditText) findViewById(R.id.loginEdtUser);
loginEdtPassword = (EditText) findViewById(R.id.loginEdtPassword);
loginBtnEnter = (Button) findViewById(R.id.loginBtnEnter);
loginBtnEnter.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AsyncCallWS task = new AsyncCallWS();
task.execute();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.login, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Login();
return null;
}
@Override
protected void onPostExecute(Void result) {
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
public void Login() {
try {
request = new SoapObject(NAMESPACE, METHOD_NAME);
envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug = true;
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
response = (SoapPrimitive) envelope.getResponse();
loginEdtUser.setText(response.toString());
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
Toast.LENGTH_SHORT).show();
}
}
错误:
{02-28 11:31:16.935: E/AndroidRuntime(4489): FATAL EXCEPTION: AsyncTask #3
02-28 11:31:16.935: E/AndroidRuntime(4489): Process: oziylmz.randevusistemi, PID: 4489
02-28 11:31:16.935: E/AndroidRuntime(4489): java.lang.RuntimeException: An error occured while executing doInBackground()
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.os.AsyncTask.done(AsyncTask.java:300)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.lang.Thread.run(Thread.java:841)
02-28 11:31:16.935: E/AndroidRuntime(4489): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.os.Handler.<init>(Handler.java:200)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.os.Handler.<init>(Handler.java:114)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.widget.Toast$TN.<init>(Toast.java:351)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.widget.Toast.<init>(Toast.java:101)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.widget.Toast.makeText(Toast.java:265)
02-28 11:31:16.935: E/AndroidRuntime(4489): at oziylmz.randevusistemi.Login.Login(Login.java:109)
02-28 11:31:16.935: E/AndroidRuntime(4489): at oziylmz.randevusistemi.Login$AsyncCallWS.doInBackground(Login.java:69)
02-28 11:31:16.935: E/AndroidRuntime(4489): at oziylmz.randevusistemi.Login$AsyncCallWS.doInBackground(Login.java:1)
02-28 11:31:16.935: E/AndroidRuntime(4489): at android.os.AsyncTask.call(AsyncTask.java:288)
02-28 11:31:16.935: E/AndroidRuntime(4489): at java.util.concurrent.FutureTask.run(FutureTask.java:237)}
您收到以下错误:
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
这意味着您已尝试在后台更改 UI
,因为我看到您的代码,您已尝试 Toast
数据捕获 login
方法。
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
response = (SoapPrimitive) envelope.getResponse();
loginEdtUser.setText(response.toString());
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
Toast.LENGTH_SHORT).show();
}
您无法在后台线程中更新 UI
,您必须在 onPostExecute
中处理错误或创建 Handler
对象并使用它。
您可以通过以下方式解决您的问题:
1- runOnUiThread Example
2-处理程序
3- 移动到 onPostExecute。
有关详细信息,请参阅以下文章:
Android background processing with Handlers, AsyncTask and Loaders - Tutorial
Toast.makeText(getApplicationContext(), "Hata:" + e.toString(),
Toast.LENGTH_SHORT).show();
这会导致异常,因为您无法在后台处理中触摸 ui 个元素。
修复: 在异步任务的 onPostexecute() 方法中制作 toast,而不是在 UI thread
上执行您想使用
runOnUiThread(new Runnable() {
@Override
public void run() {
Login();
}
});