android初使用
*
刚学习android,做了一个功能,记录遇到的问题
1,使用listview时,设置适配器adapter,忘记在getCount(),getItem(),getItemId()方法内部具体去实现,导致window leaked错误
开始还以为是有什么对话框没有hide
2,从发请求到显示数据的过程
android客户端发送请求,将数据封装成json格式,一般是启动一个子线程去请求,通过连接Webservice的接口,调用webservice发布的接口方法,
解析json格式的数据参数,执行操作,如对数据库增删改查,返回结果时依然封装成json格式,在回调函数中处理返回的数据,根据需要修改显示页面
下面是连接webservice的方法
public static final void transCall(Handler handler,String methodName, int soapVersion, boolean isDotNet, Map<String, Object> property) { /** * 命名空间 */ String NAMESPACE = INSTANCE.getNameSpace(); /** * webservice提供接口<br/> * 例如:java的wsdl——>http://192.168.1.117:10101/services?wsdl */ String ENDPOINT = INSTANCE.getEndPoint(); Message message = Message.obtain(); message.what = WebServiceStateCode.RESPONSE_SERVER_ERROR; String soapAction = NAMESPACE + methodName; HttpTransportSE transport = new HttpTransportSE(ENDPOINT, 20000); // 指定WebService的命名空间和调用的方法名 SoapObject rpc = new SoapObject(NAMESPACE, methodName); if (property != null && !property.isEmpty()) { Set<String> keys = property.keySet(); for (String key : keys) { rpc.addProperty(key, property.get(key)); } } // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( soapVersion); envelope.bodyOut = rpc; // 设置是否调用的是dotNet开发的WebService envelope.dotNet = isDotNet; // 等价于envelope.bodyOut = rpc; envelope.setOutputSoapObject(rpc); boolean called = false;//标识webService是否请求成功 try { // 调用WebService transport.call(soapAction, envelope); transport.getConnection().disconnect(); called = true; } catch (IOException e) { message.obj = "网络无法连接。"; } catch (XmlPullParserException e) { message.obj = "解析服务端xml文件异常。"; } if (called) {//webService请求成功 // // 获取返回的数据 SoapObject object = (SoapObject) envelope.bodyIn; SoapPrimitive resultSoap = (SoapPrimitive)object.getProperty("result"); if (resultSoap != null) { try { JSONObject result = new JSONObject(resultSoap.toString()); String statusCode = result.getString("statusCode"); if (statusCode.equals("200")) {// 服务端请求响应成功 if(result.has("msg")){ message.obj = result.getJSONObject("msg"); } message.what = WebServiceStateCode.RESPONSE_OK; } else if (statusCode.equals("403")) { message.what = WebServiceStateCode.RESPONSE_FORBIDDEN; } else if (statusCode.equals("500")) { message.what = WebServiceStateCode.RESPONSE_SERVER_ERROR; } } catch (JSONException e) { message.obj = "json格式数据获取异常。"; } } } handler.sendMessage(message); }
我的理解:
首先,信从A送给B
相当于设置信封上的地址,便于去找某个webservice的某个方法
String soapAction = NAMESPACE + methodName; //http://service.webservice.magnetic.com/login
相当于邮递员
HttpTransportSE transport = new HttpTransportSE(ENDPOINT, 20000);
信封,写上了邮编
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
soapVersion);
SoapObject rpc = new SoapObject(NAMESPACE, methodName);
放参数,构造信上的内容
if (property != null && !property.isEmpty()) {
Set<String> keys = property.keySet();
for (String key : keys) {
rpc.addProperty(key, property.get(key));
}
}
envelope.bodyOut = rpc; 把内容写到信上
// 调用WebService
transport.call(soapAction, envelope); 邮递员去送信,手握信封地址(soapAction)和信封(envelope,已经写了内容)
这样送信完成
然后,B有回信给A
// // 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn; //获得回信内容
一般按自己的封装原则如:
findListForSQLResponse{result={"msg":{"result":[{"0":"aaa","1":"1.3","2":"/android/vmark_1.3.apk"}]},"statusCode":"200"}; }
然后各种方法去除json格式数据
最后别忘了handler.sendMessage(message);
这是回调,给一直在等结果的人(handler)发送结果,然后自动调用handlemessage()方法
3,做后台消息推送的时候,mainactivity中启动service,service的onStartCommand()方法中查询,查询返回的结果在回调处理类中已消息的形式推送这条数据
调用webservice的方法不能正确执行,连断点都不能进
原因是在AndroidManifest.xml中配置service出错,
下面这种是调用第三方webservice使用
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service>
下面这种是调用本地
<service android:exported="false" android:name=".service.NewUpdateService" android:enabled="true" > <intent-filter> <action android:name="com.magnetic.market.service.NewUpdateService" /> </intent-filter> </service>
*
备注:公众号清汤袭人能找到我,那是随笔的地方