在Android上使用kSoap来检索数据,在第一次执行时工作,但在后续执行时返回null

时间:2014-01-03 09:11:21

标签: java android nullpointerexception ksoap2 android-ksoap2

我正在开发一个允许用户写反馈的Android应用程序,然后服务器将生成用户的articleID,ticketID和ticketnumber并返回给用户。

此应用程序中有两项活动。 MainActivity允许用户输入他们的详细信息,提交按钮将启动Process活动,该活动将详细信息发送到服务器并显示返回的articleID,ticketID和ticketnumber。

问题是,每次启动应用程序时它只能运行一次。例如,用户打开应用程序并输入其详细信息,按下提交按钮并返回相应的articleID,ticketID和ticketnumber。然后他尝试通过返回上一个活动提交第二个。他再次输入他的细节并按提交。这次返回null。

示例图片显示在http://imgur.com/a/uY6gR

但是,如果应用程序退出并清除RAM,应用程序将再次运行。

我尝试使用此方法here重新启动应用程序,但它仍然无效。

以下是Process活动中的kSoap代码。

public class Process extends Activity{

private String URL = " /*WORKING URL*/";
private String NAMESPACE = "/*WORKING URL*/";
private String soapUsername = "/*WORKING USERNAME*/";
private String soapPass = "/*WORKING PASSWORD*/";
private String METHOD_NAME = "TicketCreate";
private String SOAP_ACTION = "/*WORKING URL*/";
private Handler handler = new Handler();
private Thread thread;
TextView emailT, subjectT, complaintT, responseT, nameT;
String email, subject, complaint, name;
String articleid , ticketid ,ticketnumber;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.process);
    webservice();

    nameT = (TextView) findViewById(R.id.name);
    emailT = (TextView) findViewById(R.id.email);
    subjectT = (TextView) findViewById(R.id.subject);
    complaintT = (TextView) findViewById(R.id.complaint);
    responseT = (TextView) findViewById(R.id.responsevalue);

    Intent i = getIntent();
    // Receiving the Data
    name = i.getStringExtra("name");
    email = i.getStringExtra("email");
    subject = i.getStringExtra("subject");
    complaint = i.getStringExtra("complaint");

    // Displaying Received data
    nameT.setText(name);
    emailT.setText(email);
    subjectT.setText(subject);
    complaintT.setText(complaint);

    Button fin= (Button)findViewById(R.id.finish);
    fin.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            finish();
        }
    });
}


public void webservice(){
    thread = new Thread(){
        public void run(){
            try 
            {
                SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                // Set all input params   
                request.addProperty("UserLogin", soapUsername);
                request.addProperty("Password", soapPass);
                Hashtable<String, String> ticket = new Hashtable<String, String>();
                ticket.put("Title", subject);
                ticket.put("CustomerUser", email);
                ticket.put("CustomerID", "soapwebnologin");
                ticket.put("QueueID", "3");
                ticket.put("State", "new");
                ticket.put("PriorityID", "1");
                ticket.put("Lock", "unlock");
                ticket.put("OwnerID", "1");
                request.addProperty("Ticket", ticket);

                Hashtable<String, String> article = new Hashtable<String, String>();
                article.put("Subject", subject);
                article.put("Body", complaint);
                article.put("ContentType", "text/plain; charset=utf8");
                request.addProperty("Article", article);

                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                new MarshalHashtable().register(envelope); 
                envelope.dotNet = true;
                envelope.bodyOut = request; 

                String check = checkSSL(URL);

                if(check == "SSL"){
                    KeepAliveHttpsTransportSE httpT = new  KeepAliveHttpsTransportSE("/*WORKING URL*/", /*WORKING PORT*/, METHOD_NAME, 15000);

                    httpT.debug = true;

                    httpT.call(SOAP_ACTION, envelope);

                     KvmSerializable ks = (KvmSerializable)envelope.bodyIn;
                     articleid = ks.getProperty(0).toString();
                     ticketid = ks.getProperty(1).toString();
                     ticketnumber = ks.getProperty(2).toString();

                    Log.e("dump Request: " ,httpT.requestDump);
                    Log.e("dump response: " ,httpT.responseDump);
                    Log.e("object response : ", ks.toString());
                }
                    else{
                    HttpTransportSE httpT = new HttpTransportSE(URL);

                    httpT.debug = true;

                    httpT.call(SOAP_ACTION, envelope);

                     KvmSerializable ks = (KvmSerializable)envelope.bodyIn;
                     articleid = ks.getProperty(0).toString();
                     ticketid = ks.getProperty(1).toString();
                     ticketnumber = ks.getProperty(2).toString();

                    Log.e("dump Request: " ,httpT.requestDump);
                    Log.e("dump response: " ,httpT.responseDump);
                    Log.e("object response : ", ks.toString());
                    }


            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            handler.post(createUI);
        }
    };

    thread.start();

}


final Runnable createUI = new Runnable() {
    public void run(){
        responseT.setText("Your ticket id =" + ticketid+ " Article id ="+ articleid+" TICKET NUMBER ="+ ticketnumber);
    }
};

protected String checkSSL(String url){
    String https = url.substring(0, 4);
    if(https == "https"){
        return "SSL";
    }
    else{
        return "noSSL";
    }
}
 }

编辑:当我旋转屏幕时,它从服务器请求了另一张票,它确实有效。我感到很困惑。

1 个答案:

答案 0 :(得分:0)

显然这是一个可以通过添加以下行修复的错误:

System.setProperty("http.keepAlive", "false");
  

我最近遇到了一个非常严厉的Android操作系统错误   HTTPS连接。基本上,会发生什么:

     
      
  1. 您想在手机和服务器之间建立连接,您需要同时控制输入和输出。结果,你   使用URL.openConnection(),setDoInput()和setDoOutput()设置为   真:
  2.         

    网址网址=新网址(“https://blahblahblah.com”); URLConnection conn =   url.openConnection(); conn.setDoInput(真); conn.setDoOutput(真);

         

    在某些时候你使用conn.getOutputStream()来写入   stream,然后conn.getInputStream()来获取响应。

         
        
    1. 您正在进行HTTPS连接。有些人报告这种情况发生在正常的HTTP上,但我只看到它发生在HTTPS上。

    2.   
    3. 第一个请求经过精细和花花公子。

    4.   
    5. 第二次尝试发出请求时,连接不会发送任何数据,也不会收到任何数据;它看起来像   立即发生。如果你强制转换为HttpURLConnection,   conn.getResponseCode()返回-1而不是任何有意义的内容。

    6.         

      换句话说,每隔一个请求,请求就会彻底失败。这个   是Android中一个着名的错误,但在任何已发布的版本中都没有修复   版本。即使它已经修复,你仍然需要处理这个问题   旧版Android。

           

      有一些解决方法。首先是根本不使用   URLConnection的;如果你能找到一些方法,避免它。该   第二是重复提出同样的要求直到它起作用;它是   对我的口味来说太过分了,但是它会起作用。

           

      然后是第三种解决方法,我没有声称理解   为什么它解决了问题,但确实如此。只需设置此设置即可   申请开始:

           

      System.setProperty(“http.keepAlive”,“false”);

           

      不幸的是,这有一些缺点(保持活力是一件好事   通常),但与神秘失败的请求相比,我会   放弃它。

           

      来源:http://daniel-codes.blogspot.com/2010_07_01_archive.html

关于方向改变的问题,请阅读此处 Change screen orientation in Android without reloading the activity