根据Web服务的响应转移到新活动

时间:2011-10-28 13:32:18

标签: android web-services android-asynctask android-ksoap2 android-activity

我正在实现一个代码,该代码基于来自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文件中。有人可以帮我解决问题吗?

2 个答案:

答案 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();
        }
    }
}