我正在实现一个代码,该代码基于来自Web服务的特定响应调用我的项目中的下一个活动。我遇到了一些问题,因为它导致了NullPointerException
这是我的Android代码:
package com.example;
import java.net.SocketException;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class TeacherLogin2Activity extends Activity
{
private final String NAMESPACE = "http://tempuri.org/";
private final String URL = "http://10.0.2.2/loginteacher/Service1.asmx";
String t_id;
String password;
String ahead;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button signin = (Button) findViewById(R.id.regsubmitbtn);
signin.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
EditText etxt_user = (EditText) findViewById(R.id.usereditlog);
t_id = etxt_user.getText().toString();
EditText etxt_password = (EditText) findViewById(R.id.pwdeditlog);
password = etxt_password.getText().toString();
new LoginTask().execute();
}
});
}
private String doLogin(String t_id, String password) {
String res=null;
final String SOAP_ACTION = "http://tempuri.org/GetLogin";
final String METHOD_NAME = "GetLogin";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("teacherid", t_id);
request.addProperty("password",password);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true; // Set this variable to true for
// compatibility with what seems to be the
// default encoding for .Net-Services.
envelope.setOutputSoapObject(request);
System.out.println(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
Log.i("myApp", response.toString());
System.out.println("response" +response);
res=response.toString();
System.out.println(res);
}catch(SocketException ex)
{
Log.e("Error : " , "Error on soapPrimitiveData() " + ex.getMessage());
ex.printStackTrace();
}
catch (Exception e) {
Log.e("Error : " , "Error on soapPrimitiveData() " + e.getMessage());
e.printStackTrace();
}
return res;
}
private class LoginTask extends AsyncTask<Void, String, String> {
private final ProgressDialog dialog = new ProgressDialog(
TeacherLogin2Activity.this);
protected void onPreExecute() {
this.dialog.setMessage("Logging in...");
this.dialog.show();
}
protected String doInBackground(final Void... unused) {
String auth=doLogin(t_id,password);
System.out.println(auth);
return null; // don't interact with the ui!
}
protected void onPostExecute(String result)
{
ahead=result;
if(result.equals("Welcome to this activity")){
Intent showContent = new Intent(getApplicationContext(),newscreen.class);
startActivity(showContent);
}
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
}
}
}
更新了Logcat,同时显示了运行时异常:
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): FATAL EXCEPTION: main
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.newscreen}: java.lang.NullPointerException
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at android.os.Handler.dispatchMessage(Handler.java:99)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at android.os.Looper.loop(Looper.java:123)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at android.app.ActivityThread.main(ActivityThread.java:4627)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at java.lang.reflect.Method.invokeNative(Native Method)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at java.lang.reflect.Method.invoke(Method.java:521)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at dalvik.system.NativeStart.main(Native Method)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): Caused by: java.lang.NullPointerException
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at com.example.newscreen.onCreate(newscreen.java:25)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
10-28 19:40:00.099: ERROR/AndroidRuntime(1001): ... 11 more
我已将所有必需的互联网权限放入AndroidManifest.xml文件中。有人可以帮我解决问题吗?
答案 0 :(得分:1)
问题是来自doInBackground的返回值,即 null 。 在onPostExecute中,您调用null的equals方法...
protected String doInBackground(final Void... unused) {
String auth=doLogin(t_id,password);
System.out.println(auth);
return null; //it is passed as argument to onPostExecute
}
protected void onPostExecute(String result) {
(...)
if(result.equals("Welcome to this activity")){ // crashes
// null.equals(...) ...
Intent showContent = new Intent(getApplicationContext(),newscreen.class);
startActivity(showContent);
}
(...)
}
以这种方式编辑代码:
protected String doInBackground(final Void... unused) {
String auth=doLogin(t_id,password);
System.out.println(auth);
return auth;
}
protected void onPostExecute(String result) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
if(result.equals("Welcome to this activity")) {
Intent showContent = new Intent(getApplicationContext(),newscreen.class);
startActivity(showContent);
}
}
答案 1 :(得分:1)
结果以 Null 显示,因此它会抛出Null Pointer Exception
,尝试打印结果并使用Log检查即将发生的事情。
将结果存储在Global变量中并在Asyn任务中访问它。
例如:将变量声明为String final_result before of Activity
并将结果存储为final_result=result
然后比较final_result.equalsIgnoreCase("BLA BLA BLA");
public class Articles extends Activity {
String res=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.articles_list);
new LoginTask().execute(t_id,password);
}
}
public class Articles_Asyn_Task extends AsyncTask<String, Void, Void> {
// can use UI thread here
protected void onPreExecute() {
progress_dialog_async_task = ProgressDialog.show(getParent(), "Loading...","Please wait...");
}
@Override
protected Void doInBackground(String... params) {
String t_id,password;
try{
t_id=params[0];
password=params[1];
}catch(Exception e){}
final String SOAP_ACTION = "http://tempuri.org/GetLogin";
final String METHOD_NAME = "GetLogin";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("teacherid", t_id);
request.addProperty("password",password);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true; // Set this variable to true for
// compatibility with what seems to be the
// default encoding for .Net-Services.
envelope.setOutputSoapObject(request);
System.out.println(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
Log.i("myApp", response.toString());
System.out.println("response" +response);
res=response.toString();
System.out.println(res);
}catch(SocketException ex)
{
Log.e("Error : " , "Error on soapPrimitiveData() " + ex.getMessage());
ex.printStackTrace();
}
catch (Exception e) {
Log.e("Error : " , "Error on soapPrimitiveData() " + e.getMessage());
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Void result) {
if(res.equalsIgnoreCase("BLA BLA BLA")){
startActivity(new Intent(Main.this,Main_1.class));
}
if (progress_dialog_async_task.isShowing()) {
progress_dialog_async_task.dismiss();
}
}
}