Reputation: 15
I have used post method to call web service and getting an error while calling the web service .
Logcat:
09-04 04:58:56.437: E/AndroidRuntime(803): FATAL EXCEPTION: AsyncTask #1
09-04 04:58:56.437: E/AndroidRuntime(803): java.lang.RuntimeException: An error occure while executing doInBackground()
the web service i am using is class AttemptLogin extends AsyncTask {
/**
* Before starting background thread Show Progress Dialog
* */
boolean failure = false;
@Override
protected void onPreExecute() {
String username = user.getText().toString();
String password = pass.getText().toString();
super.onPreExecute();
pDialog = new ProgressDialog(Loginpage.this);
pDialog.setMessage("Attempting login...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected String doInBackground(String... args) {
// TODO Auto-generated method stub
// Check for success tag
String username=args [0];
String password=args[1];
int success;
try {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("password", password));
Log.d("request!", "starting");
// getting product details by making HTTP request
JSONObject json = jsonParser.makeHttpRequest(
LOGIN_URL, "POST", params);
// check your log for json response
Log.d("Login attempt", json.toString());
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
Log.d("Login Successful!", json.toString());
Intent i = new Intent(Loginpage.this, Propertyapp.class);
finish();
startActivity(i);
return json.getString(TAG_MESSAGE);
}else{
Log.d("Login Failure!", json.getString(TAG_MESSAGE));
return json.getString(TAG_MESSAGE);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
// dismiss the dialog once product deleted
pDialog.dismiss();
if (file_url != null){
Toast.makeText(Loginpage.this, file_url, Toast.LENGTH_LONG).show();
}
}
}
public JSONObject makeHttpRequest(String url, String method, List params) {
// Making HTTP request
try {
// check for request method
if(method == "POST"){
// request method is POST
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}else if(method == "GET"){
// request method is GET
DefaultHttpClient httpClient = new DefaultHttpClient();
String paramString = URLEncodedUtils.format(params, "utf-8");
url += "?" + paramString;
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
Upvotes: 1
Views: 1227
Reputation: 22527
Your problem
String username = user.getText().toString();
String password = pass.getText().toString();
You can not perform UI updates in the background thread. Move them out.
You can use onPreExecute() method for that, or just pass username and password to the AsyncTask().
public class YourAsyncTask extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... params) {
String username = params[0];
String password = params[1];
....
}
}
Upvotes: 0
Reputation: 7415
Declare intent globally & initialize in oncreate(),
Intent i ;
i= new Intent(Loginpage.this, Propertyapp.class);
use it as per your requirement
startActivity(i);
Upvotes: 0
Reputation: 6899
Hope this might help you.
int sucess;//declare in global
@Override
protected String doInBackground(String... args)
{
// TODO Auto-generated method stub
// Check for success tag
String username = user.getText().toString();
String password = pass.getText().toString();
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("password", password));
// getting product details by making HTTP request
JSONObject json = jsonParser.makeHttpRequest(
LOGIN_URL, "POST", params);
try
{
success = json.getInt(TAG_SUCCESS);
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
pDialog.dismiss();//progress dialog pDialog
if (success == 1) {
Intent i = new Intent(Loginpage.this, Propertyapp.class);
startActivity(i);
finish();
}
}
}
Upvotes: 0
Reputation: 5731
I think the lines
String username = user.getText().toString();
String password = pass.getText().toString();
cause the problem.
You can't access or modify UI inside AsyncTask.
You can do this before it either inside onPreExecute() (Prefer to declare variables globally)
or before calling .execute("")
and passing username and password as args ie, .execute(username,password);
. Then inside doInBackground, you can get it as args[0] and args[1].
Upvotes: 0
Reputation: 11194
String username = user.getText().toString();
move this line in onPreExecute method ..u cannot handle Ui in doInBackground Method
Upvotes: 1