connecting to webservice with kSOAP in android - java

I am trying to connect web service with kSOAP Library. code send 4 fields like username and password, name and family to the server but in server everything received null ! this is my code where is the problem?
WebService.java
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.util.Log;
public class WebService {
private static String NAMESPACE = "xxxxxxxxxxxx";
public final static String URL = "xxxxxxxxxxxx";
private static String SOAP_ACTION = "xxxxxxxxxxxxxxx";
private static final String METHOD = "Register";
public static String invokeWS() {
String resTxt = null;
SoapObject request = new SoapObject(NAMESPACE, METHOD);
request.addProperty("username","user");
request.addProperty("password","pass");
request.addProperty("name","MyName");
request.addProperty("family","MyFamily");
Log.v("", ""+request);
SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope( SoapEnvelope.VER12);
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION+METHOD, envelope);
SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
resTxt = response.toString();
} catch (Exception e) {
e.printStackTrace();
Log.e("",""+e);
resTxt = "Error !!!!";
}
return resTxt;
}
}
and call invokeWS() in MainActivity.java
AsyncCallWS task = new AsyncCallWS();
//Call execute
task.execute();
private class AsyncCallWS extends AsyncTask<String, Void, Void> {
#Override
protected Void doInBackground(String... params) {
displayText = WebService.invokeWS();
return null;
}
#Override
protected void onPostExecute(Void result) {
//Set response
Log.v("", "Recive : "+displayText);
}
#Override
protected void onPreExecute() {
}
#Override
protected void onProgressUpdate(Void... values) {
}
}

Add This Line To Your Code:
envelope.dotNet=true

Related

Android Get data or table webservice

i watched too many videos about android webservises
but all them results finished error
"java.net.SocketTimeoutException"
i used
"ksoap2-android-2.5.2.jar"
can you guide me on this
my codes ;
package com.example.acr_soaptest2;
import android.util.Log;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
public class ServiceManager {
private static final String METHOD_NAME = "MySQl_Query";
private static final String NAMESPACE = "http://tempuri.org/";
private static final String SOAP_ACTION = "http://tempuri.org/MySQl_Query";
private static final String URL = "http://localhost:8090/WebService1.asmx";
SoapObject soapObject;
SoapSerializationEnvelope soapSerializationEnvelope;
HttpTransportSE httpTransportSE;
public void PushData(String query) {
soapObject = new SoapObject(NAMESPACE, METHOD_NAME);
soapObject.addProperty("sorgu", query);
soapSerializationEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
soapSerializationEnvelope.dotNet = true;
soapSerializationEnvelope.setOutputSoapObject(soapObject);
httpTransportSE = new HttpTransportSE(URL);
httpTransportSE.debug = true;
try {
httpTransportSE.call(SOAP_ACTION, soapSerializationEnvelope);
SoapPrimitive soapPrimitive=(SoapPrimitive)soapSerializationEnvelope.getResponse();
System.out.println(soapPrimitive.toString());
Log.d("satir:", soapPrimitive.toString());
} catch (Exception ex) {
ex.printStackTrace();
Log.d("satir:", ex.toString());
}
}
}

Android cannot serialize error

I am working on a project to invoke a web service using android. I use ksoap2 for that.
I created a my own data type(just to try) which contains two string variables. It is like this
public class MyType {
String fName;
String lName;
public MyType(String s1,String s2){
fName = s1;
lName = s2;
}
}
I created this data type at both ends.(web service end and android application end). I wrote a program to invoke web service and then to concatenate given strings using my data type.
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import java.io.IOException;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;
import android.os.AsyncTask;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
public final static String URL = "http://192.168.69.1:8080/WebApplication4/MyWebService?wsdl";
public static final String NAMESPACE = "http://mywebservice.android.com/";
public static final String SOAP_ACTION_PREFIX = "/";
private static final String METHOD = "objectMethod";
private TextView textView;
MyType mt = new MyType("Upul","Tharanga");
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.test);
AsyncTaskRunner runner = new AsyncTaskRunner(mt);
runner.execute();
}
private class AsyncTaskRunner extends AsyncTask<Integer, String, String> {
private String resp;
MyType a;
public AsyncTaskRunner(MyType a){
this.a = a;
}
#Override
protected String doInBackground(Integer... params) {
publishProgress("Loading contents..."); // Calls onProgressUpdate()
try {
// SoapEnvelop.VER11 is SOAP Version 1.1 constant
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
SoapObject request = new SoapObject(NAMESPACE, METHOD);
PropertyInfo pi1=new PropertyInfo();
pi1.setType(String.class);
pi1.setName("parameter");
pi1.setValue(a);
request.addProperty(pi1);
envelope.bodyOut = request;
HttpTransportSE transport = new HttpTransportSE(URL);
try {
transport.call(NAMESPACE + SOAP_ACTION_PREFIX + METHOD, envelope);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
//bodyIn is the body object received with this envelope
if (envelope.bodyIn != null) {
//getProperty() Returns a specific property at a certain index.
//SoapPrimitive resultSOAP = (SoapPrimitive) ((SoapObject) envelope.bodyIn).getProperty(0);
//Object resultSOAP = (SoapPrimitive)((SoapObject) envelope.bodyIn).getProperty(0);
Object resultSOAP = (SoapPrimitive)((SoapObject) envelope.bodyIn).getProperty(0);
resp=resultSOAP.toString();
}
} catch (Exception e) {
e.printStackTrace();
resp = e.getMessage();
}
return resp;
}
/**
*
* #see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
#Override
protected void onPostExecute(String result) {
// execution of result of Long time consuming operation
// In this example it is the return value from the web service
textView.setText(result);
}
/**
*
* #see android.os.AsyncTask#onPreExecute()
*/
#Override
protected void onPreExecute() {
// Things to be done before execution of long running operation. For
// example showing ProgessDialog
}
/**
*
* #see android.os.AsyncTask#onProgressUpdate(Progress[])
*/
#Override
protected void onProgressUpdate(String... text) {
textView.setText(text[0]);
// Things to be done while execution of long running operation is in
// progress. For example updating ProgessDialog
}
}
}
What my web service do is take the MyType parameter as input and concatenate those two given strings and return the concatenated string.
When I run the android application I get an error(run time error I think) saying cannot serialize MyType.
Any suggestions to solve the issue?
Try implementing Serializable
public class MyType implements Serializable {
String fName;
String lName;
public MyType(String s1,String s2){
fName = s1;
lName = s2;
}
}

Parsing JSON data sent by an Android application

The application published by hmkcode.com takes some data from user and parse & convert, and send to a java servlet called jsonservlet. I changed the input values parsed but I'm receiving everytime NullPointerException.
java.lang.NullPointerException
java.io.StringReader.<init>(StringReader.java:50)
com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:796)
com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
iaau.uimsmobile.getData.getDataServlet.doPost(getDataServlet.java:48)
iaau.uimsmobile.getData.getDataServlet.doGet(getDataServlet.java:65)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
LogCat trace
02-01 10:31:38.232 424-424/com.iaaum D/dalvikvm﹕ GC_EXTERNAL_ALLOC freed 81K, 52% free 2630K/5379K, external 904K/1038K, paused 72ms
02-01 10:32:03.392 424-424/com.iaaum W/KeyCharacterMap﹕ No keyboard for id 0
02-01 10:32:03.392 424-424/com.iaaum W/KeyCharacterMap﹕ Using default keymap: /system/usr/keychars/qwerty.kcm.bin
02-01 10:32:08.962 424-433/com.iaaum D/InputStream﹕ Connection to http://localhost:8080 refused
02-01 10:34:28.142 424-434/com.iaaum D/InputStream﹕ Connection to http://localhost:8080 refused
At last, I changed the strings in JSON format inside the toString() methods in both sides. The failure what #SotiriosDelimanolis talked about is appeared.
com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: java.io.StringReader#30b3b5; line: 1, column: 1]
com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:2931)
com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2873)
com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
iaau.uimsmobile.getData.getDataServlet.doPost(getDataServlet.java:48)
iaau.uimsmobile.getData.getDataServlet.doGet(getDataServlet.java:65)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
Client side --> User.java
public class User{
private String IDnumber;
private String Password;
public String getIDnumber() {
return IDnumber;
}
public void setIDnumber(String IDnumber) {
this.IDnumber = IDnumber;
}
public String getPassword() {
return Password;
}
public void setPassword(String password) {
Password = password;
}
#Override
public String toString()
{
// { "IDnumber":"" , "Password":"" }
return "{\"IDnumber\":"+"\""+IDnumber+"\""+",\"Password\":"+"\""+Password+"\"}";
}
}
Client side --> LoginActivity.java
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
import com.iaaum.user.User;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class LoginActivity extends Activity implements OnClickListener
{
TextView IsConnected;
EditText id_number;
EditText password;
Button sign_button;
User current_user;
public String urlAddress = "http://192.168.1.101:8080/UIMSMobile/getDataServlet";
//public String urlAddress = "http://127.0.0.1:8080/UIMSMobile/getDataServlet";
//public String urlAddress = "http://localhost:8080/UIMSMobile/getDataServlet";
#Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_login);
// get reference to the views
IsConnected = (TextView) findViewById(R.id.isConnected);
id_number = (EditText) findViewById(R.id.id_number);
password = (EditText) findViewById(R.id.password);
sign_button= (Button) findViewById(R.id.sign_in_button);
// check if you are connected or not
if(IsConnectedMethod())
{
IsConnected.setBackgroundColor(0xFF00CC00);
IsConnected.setText("You are connected");
}
else{
IsConnected.setText("You are NOT connected");
}
// add click listener to Button "POST"
sign_button.setOnClickListener(this);
}
#Override
public void onClick(View view)
{
switch(view.getId()){
case R.id.sign_in_button:
if(!validate())
Toast.makeText(getBaseContext(), "Enter some data!", Toast.LENGTH_LONG).show();
// call AsyncTask to perform network operation on separate thread
new HttpAsyncTask().execute(urlAddress);
break;
}
}
public boolean IsConnectedMethod()
{
ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Activity.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
public static String Post(String url, User current_user)
{
InputStream inputStream = null;
String result = "";
try
{
// 1. create HttpClient
HttpClient httpclient = new DefaultHttpClient();
// 2. make POST request to the given URL
HttpPost httpPost = new HttpPost(url);
String json = "";
// 3. build jsonObject
JSONObject jsonObject = new JSONObject();
jsonObject.accumulate("IDnumber", current_user.getIDnumber());
jsonObject.accumulate("Password", current_user.getPassword());
// 4. convert JSONObject to JSON in String
json = jsonObject.toString();
// ** Alternative way to convert Person object to JSON string using Jackson Lib
// ObjectMapper mapper = new ObjectMapper();
// json = mapper.writeValueAsString(person);
// 5. set json to StringEntity
StringEntity se = new StringEntity(json);
// 6. set httpPost Entity
httpPost.setEntity(se);
// 7. Set some headers to inform server about the type of the content
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
// 8. Execute POST request to the given URL
HttpResponse httpResponse = httpclient.execute(httpPost);
// 9. receive response as inputStream
inputStream = httpResponse.getEntity().getContent();
// 10. convert inputstream to string
if(inputStream != null)
result = convertInputStreamToString(inputStream);
else
result = "Did not work!";
} catch (Exception e) {
Log.d("InputStream", e.getLocalizedMessage());
}
// 11. return result
return result;
}
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
#Override
protected String doInBackground(String... urls)
{
current_user = new User();
current_user.setIDnumber(id_number.getText().toString());
current_user.setPassword(password.getText().toString());
return Post(urls[0], current_user);
}
// onPostExecute displays the results of the AsyncTask.
#Override
protected void onPostExecute(String result) {
Toast.makeText(getBaseContext(), "Data Sent!", Toast.LENGTH_LONG).show();
}
}
private boolean validate()
{
if(id_number.getText().toString().trim().equals(""))
return false;
else return !password.getText().toString().trim().equals("");
}
private static String convertInputStreamToString(InputStream inputStream) throws IOException {
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
String line = "";
String result = "";
while((line = bufferedReader.readLine()) != null)
result += line;
inputStream.close();
return result;
}
}
Client side --> AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.iaaum" >
<uses-sdk
android:minSdkVersion="8"
android:maxSdkVersion="19"
/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<activity
android:name="com.iaaum.LoginActivity"
android:label="#string/title_activity_login" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Server side --> User.java
public class User
{
private String idnumber;
private String password;
public User(String idnumber, String password) {
this.idnumber = idnumber;
this.password = password;
}
public String getIDnumber() {
return idnumber;
}
public void setIDnumber(String idnumber) {
this.idnumber = idnumber;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
#Override
public String toString()
{
return "{\"IDnumber\":"+"\""+idnumber+"\""+",\"Password\":"+"\""+password+"\"}";
}
}
Server side --> getDataServlet.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
public class getDataServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
// This will store all received articles
List<User> _users = new LinkedList<User>();
/***************************************************
* URL: /getDataServlet
* doPost(): receives JSON data, parse it, map it and send back as JSON
* #param request
* #param response
* #throws javax.servlet.ServletException
* #throws java.io.IOException
****************************************************/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// 1. get received JSON data from request
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
String json = "";
if(br.readLine() != null)
{
json = br.readLine();
}
// 2. initiate jackson mapper
ObjectMapper mapper = new ObjectMapper();
// 3. Convert received JSON to User
User _user = mapper.readValue(json, User.class);
// 4. Set response type to JSON
response.setContentType("application/json");
// 5. Add article to List<Article>
_users.add(_user);
// 6. Send List<Article> as JSON to client
mapper.writeValue(response.getOutputStream(), _users);
}
#Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doPost(request, response);
}
#Override
public String getServletInfo()
{
return "Short description";
}
}
The only way that exception could be thrown is if the String json you pass in
mapper.readValue(json, User.class);
is null.
You're doing something wrong here
if(br != null)
{
json = br.readLine();
}
br could never be null there. Maybe you meant
String temp;
if ((temp = br.readLine()) != null)
{
json = temp;
}
Or even better, pass the stream directly to one of the ObjectMapper's overloaded readValue(..) methods and handle any errors.
In any case, it seems you aren't sending anything in the body of the request, so readLine() returns null which you assign to json and that causes a failure in the ObjectMapper.
Your doGet() is delegating to your doPost(). Is it possible you are sending GET requests?
By handling your suggessions, I made some changes in codes and the application is working now. Here is the changes:
Server Side ---> getDataServlet.java
package com.****;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.****.dao.User;
public class getDataServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
List<User> users = new LinkedList<User>();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
String json = "";
if(br != null){
json = br.readLine();}
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
response.setContentType("application/json");
if(users.size() > 20){
users.remove(0);}
users.add(user);
mapper.writeValue(response.getOutputStream(), users);
}
#Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
ObjectMapper mapper = new ObjectMapper();
resp.setContentType("application/json");
mapper.writeValue(resp.getOutputStream(), users);
}
}
Server Side --> User.java
package com.*****.dao;
public class User {
private String idnumber;
private String password;
public String getIdnumber() {
return idnumber;
}
public void setIdnumber(String idnumber) {
this.idnumber = idnumber;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
#Override
public String toString() {
return "User [idnumber=" + idnumber + ", password=" + password + "]";
}
}
Client Side ---> MainActivity.java
JSONObject jsonObject = new JSONObject();
jsonObject.accumulate("idnumber", user.getIdnumber());
jsonObject.accumulate("password", user.getPassword());
Client Side ---> User.java
#Override
public String toString()
{
return "User [idnumber=" + idnumber + ", password=" + password + "]";
}
And after post data output appeared:
[{"idnumber":"987654321 ","password":"123456789"}]
Solution 1:
May be its problem of you given URL, if you working on localhost then use your IP Address instead of localhost
you can check your IP in command prompt using ipconfig command.
Solution 2:
In your User.java You may have to use JSONObject and JSONArray to create JSON String in toString() method.

Android is returning a String after 'AsyncTask'

Here is my code:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import android.os.AsyncTask;
import android.util.Log;
public class JsonController
{
private JSONObject inputData, json, finalResult;
private String authentication;
public JsonController()
{
json = new JSONObject();
inputData = new JSONObject();
}
public void createAuthentication(String userName, String apiKey)
{
authentication = "";
}
public void setModel(String model) throws JSONException
{
json.put("model",model);
}
public void setData(String id, String deviceType) throws JSONException
{
inputData.put(id, deviceType);
}
public void getPrediction()
{
new sendJSon().execute("");
return finalResult.toString();
}
private class sendJSon extends AsyncTask<String,Void,String>
{
#Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(authentication);
httppost.setHeader("Content-type", "application/json; charset=utf-8");
try {
// Add your data
json.put("input_data", inputData);
StringEntity se = new StringEntity( json.toString());
httppost.setEntity(se);
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
BufferedReader reader = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent(), "UTF-8"));
String jsonString = reader.readLine();
JSONTokener tokener = new JSONTokener(jsonString);
finalResult = new JSONObject(tokener);
}
catch(Exception e)
{
Log.d("Error here", "Error is here",e);
}
return null;
}
}
}
This code always crashes in getPrediction() because of NulPointerException. NullPointerException is because the Async task take time to generate the String, and the getPrediction() method returns the string before it is ready. All of these methods get called via external classes, so how can I solve this?
you can check whether ASYNCTASK has finished execution or not until then you can halt the returning of string from method getPrediction();
if(CLASSOBJECT!= null && CLASSOBJECT.getStatus() == Status.RUNNING) {
//DO NOT RETURN ANY VALUE
}else{
//RETURN VALUE
}
Try to return the String in your doInBackground method as :
return jsonString;
As you have pointed
outNullPointerException is because the Async task take time to generate the
String, and the getPrediction() method returns the string before it is ready.
You should run your network based operation in thread in doInBackground and then join that thread. Then you should call getPrediction() in onPostExecute(). Thus you'll have the data before the method is called.
Use onPostExecute() instead. onPostExecute() receives the return value from doInBackground() after it finishes. From there you can do whatever needs to be done with your result.
If onPostExecute() isn't flexible enough for you, consider using a CountDownLatch to stall your main code execution until AsyncTask returns.
Here is an sample code which you can implement
public interface AsyncResponseHandler {
public String resultCall(String resultStr);
}
public class MyMainClass extends Activity implements AsyncResponseHandler{
public void doProcessing(){
new AsynTasker(this).execute(null); //here this is instance of AsyncResponseHandler
}
#Override
public String resultCall(String resultStr) {
//here you will receive results from your async task after execution and you can carry out whatever process you want to do.
}
}
public class AsynTasker extends AsyncTask<String,Void,String>{
AsyncResponseHandler handler=null;
public AsynTasker(AsyncResponseHandler handler){
this.handler = handler
}
#Override
protected String doInBackground(String... params) {
// do your processing
return resultString;
}
#Override
protected void onPostExecute(String result) {
this.handler.resultCall(result);
}
}

Consume service from wsdl file using ksoap2 in java environment

I need your help in order to consume the services of this wsdl file:
http://lyrics.wikia.com/server.php?wsdl
For example the service "getArtist" with parameter "artist=U2"
I developed this java code:
public class Constante {
public static final String SOAP_ACTION = "LyricWiki#getArtist";
public static final String METHOD_NAME = "getArtist";
public static final String NAMESPACE = "LyricWiki";
public static final String URL = "http://lyrics.wikia.com/server.php";
public static final String KEY_ARTIST = "artist";
}
import java.io.IOException;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;
public class TestWSDL {
public static void run() {
SoapObject soapclient = new SoapObject(Constante.NAMESPACE, Constante.METHOD_NAME);
// Yes you need this one in order to send the whole string or else only
// the first letter
// is going to be send
SoapObject parameters = new SoapObject(Constante.NAMESPACE, Constante.METHOD_NAME);
parameters.addProperty(Constante.KEY_ARTIST, "U2");
soapclient.addProperty(Constante.METHOD_NAME, parameters);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(soapclient);
HttpTransportSE httpTransportSE = new HttpTransportSE(Constante.URL);
try {
httpTransportSE.call(Constante.SOAP_ACTION, envelope);
Object result = envelope.getResponse();
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
run();
}
}
And I got:
org.xmlpull.v1.XmlPullParserException: unterminated entity ref (position:TEXT ?
I think that my problem is in the class "Constante" but I do not know the right format to use.
Any advice or code solution will be good for me,
Thanks in advance for your help and time
I tested using chartlyrics and I got the lyric,
Now, I share with you my code:
public class Constante {
public static final String SOAP_ACTION = "http://api.chartlyrics.com/SearchLyricDirect";
public static final String METHOD_NAME = "SearchLyricDirect";
public static final String NAMESPACE = "http://api.chartlyrics.com/";
public static final String URL = "http://api.chartlyrics.com/apiv1.asmx";
public static final String KEY_ARTIST = "artist";
public static final String KEY_SONG = "song";
}
import java.io.IOException;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;
public class TestWSDL {
public static void run2() throws SoapFault {
SoapObject request = new SoapObject(Constante.NAMESPACE,
Constante.METHOD_NAME);
request.addProperty(Constante.KEY_ARTIST, "U2");
request.addProperty(Constante.KEY_SONG, "One");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(
Constante.URL);
try {
// call the web service method
androidHttpTransport.call(Constante.SOAP_ACTION, envelope);
} catch (Exception e) {
e.printStackTrace();
}// Next task is to get Response and format that response
SoapObject obj;
obj = (SoapObject) envelope.getResponse();
// System.out.println(obj);
System.out.println(obj.getProperty("TrackId"));
System.out.println(obj.getProperty("LyricChecksum"));
System.out.println(obj.getProperty("LyricId"));
System.out.println(obj.getProperty("LyricSong"));
System.out.println(obj.getProperty("LyricArtist"));
System.out.println(obj.getProperty("LyricUrl"));
System.out.println(obj.getProperty("LyricCovertArtUrl"));
System.out.println(obj.getProperty("LyricRank"));
System.out.println(obj.getProperty("LyricCorrectUrl"));
System.out.println(obj.getProperty("Lyric"));
}
public static void main(String[] args) {
try {
run2();
} catch (SoapFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
I hope to consume the LyricWiki soap api.
Regards.

Categories

Resources