我正在开发一个允许用户写反馈的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";
}
}
}
编辑:当我旋转屏幕时,它从服务器请求了另一张票,它确实有效。我感到很困惑。
答案 0 :(得分:0)
显然这是一个可以通过添加以下行修复的错误:
System.setProperty("http.keepAlive", "false");
我最近遇到了一个非常严厉的Android操作系统错误 HTTPS连接。基本上,会发生什么:
- 您想在手机和服务器之间建立连接,您需要同时控制输入和输出。结果,你 使用URL.openConnection(),setDoInput()和setDoOutput()设置为 真:
醇>网址网址=新网址(“https://blahblahblah.com”); URLConnection conn = url.openConnection(); conn.setDoInput(真); conn.setDoOutput(真);
在某些时候你使用conn.getOutputStream()来写入 stream,然后conn.getInputStream()来获取响应。
您正在进行HTTPS连接。有些人报告这种情况发生在正常的HTTP上,但我只看到它发生在HTTPS上。
第一个请求经过精细和花花公子。
- 醇>
第二次尝试发出请求时,连接不会发送任何数据,也不会收到任何数据;它看起来像 立即发生。如果你强制转换为HttpURLConnection, conn.getResponseCode()返回-1而不是任何有意义的内容。
换句话说,每隔一个请求,请求就会彻底失败。这个 是Android中一个着名的错误,但在任何已发布的版本中都没有修复 版本。即使它已经修复,你仍然需要处理这个问题 旧版Android。
有一些解决方法。首先是根本不使用 URLConnection的;如果你能找到一些方法,避免它。该 第二是重复提出同样的要求直到它起作用;它是 对我的口味来说太过分了,但是它会起作用。
然后是第三种解决方法,我没有声称理解 为什么它解决了问题,但确实如此。只需设置此设置即可 申请开始:
System.setProperty(“http.keepAlive”,“false”);
不幸的是,这有一些缺点(保持活力是一件好事 通常),但与神秘失败的请求相比,我会 放弃它。
关于方向改变的问题,请阅读此处 Change screen orientation in Android without reloading the activity