I am trying to get some user inputs. More specifically, I want to get someone to enter a value as speed and when I click calculate then my if ... else if
structures will calculate the resulting amount to pay as fine and display it.
Then when I click save then these input data including resulting fine should be uploaded to my SAL database.
Unfortunately when I click save i get a long list of errors... It'd be great if someone could point out what I am doing wrong so that I could learn from my mistakes. This is my first time doing this so I get a little lost here and there.
Find my Java code below:
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.os.AsyncTask
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.DatePicker;
import android.widget.TimePicker;
import android.widget.ViewSwitcher;
import android.app.Dialog;
import java.text.*;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import com.finecalc.library.JSONParser;
import com.finecalc.ltafinecalculator.FineCalc.CreateNewFine;
public class FineCalc extends Activity {
private EditText speed;
private TextView Fine;
Button btnSelectDate,btnSelectTime;
static final int DATE_DIALOG_ID = 0;
static final int TIME_DIALOG_ID=1;
public int year,month,day,hour,minute;
private final int mYear, mMonth, mDay,mHour,mMinute;
// Button btnRegisterfine = (Button) findViewById(R.id.savefine);
private ProgressDialog pDialog;
JSONParser jsonParser = new JSONParser();
EditText inputDriver;
EditText inputLicence;
EditText inputOfficer;
EditText inputSpeed;
EditText FineAppl;
EditText inputCategory;
TextView registerFine;
// url to create new fine
private static String url_create_fine = "http://192.168.43.183/androidltafj_api/create_fine.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
public FineCalc()
{
// Assign current Date and Time Values to Variables
final Calendar c = Calendar.getInstance();
this.mYear = c.get(Calendar.YEAR);
this.mMonth = c.get(Calendar.MONTH);
this.mDay = c.get(Calendar.DAY_OF_MONTH);
this.mHour = c.get(Calendar.HOUR_OF_DAY);
this.mMinute = c.get(Calendar.MINUTE);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.speed = (EditText) findViewById(R.id.editText3);
this.Fine = (TextView)findViewById(R.id.editText4);
this.btnSelectDate=(Button)findViewById(R.id.buttonSelectDate);
this.btnSelectTime=(Button)findViewById(R.id.buttonSelectTime);
this.inputDriver = (EditText) findViewById(R.id.editText1);
this.inputLicence = (EditText) findViewById(R.id.editText2);
this.inputOfficer = (EditText) findViewById(R.id.editText5);
this.inputSpeed = (EditText) findViewById(R.id.editText3);
this.FineAppl = (EditText) findViewById(R.id.editText4);
this.inputCategory = (EditText) findViewById(R.id.editText6);
this.registerFine = (TextView) findViewById(R.id.fineregistered);
// Create button
final Button btnRegisterfine = (Button) findViewById(R.id.savefine);
// Set ClickListener on btnSelectDate
this.btnSelectDate.setOnClickListener(new View.OnClickListener() {
public void onClick(final View v) {
// Show the DatePickerDialog
showDialog(DATE_DIALOG_ID);
}
});
// Set ClickListener on btnSelectTime
this.btnSelectTime.setOnClickListener(new View.OnClickListener() {
public void onClick(final View v) {
// Show the TimePickerDialog
showDialog(TIME_DIALOG_ID);
}
});
// button click event
btnRegisterfine.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
// creating new product in background thread
new CreateNewFine().execute();
}
});
}
/**
* Background Async Task to Create new product
* */
class CreateNewFine extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
FineCalc.this.pDialog = new ProgressDialog(FineCalc.this);
FineCalc.this.pDialog.setMessage("Registering Fine..");
FineCalc.this.pDialog.setIndeterminate(false);
FineCalc.this.pDialog.setCancelable(true);
FineCalc.this.pDialog.show();
}
/**
* Creating product
* */
protected String doInBackground(final String... args) {
final String driver = FineCalc.this.inputDriver.getText().toString();
final String licencenum = FineCalc.this.inputLicence.getText().toString();
final String officer = FineCalc.this.inputOfficer.getText().toString();
final String speed = FineCalc.this.inputSpeed.getText().toString();
final String fine= FineCalc.this.FineAppl.getText().toString();
final String category = FineCalc.this.inputCategory.getText().toString();
// Building Parameters
final List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("driver", driver));
params.add(new BasicNameValuePair("licencenum", licencenum));
params.add(new BasicNameValuePair("officer", officer));
params.add(new BasicNameValuePair("speed", speed));
params.add(new BasicNameValuePair("fine", fine));
params.add(new BasicNameValuePair("category", category));
// getting JSON Object
// Note that create product url accepts POST method
final JSONObject json = FineCalc.this.jsonParser.makeHttpRequest(url_create_fine, "POST", params);
// check log cat from response
Log.d("Create Response", json.toString());
// check for success tag
try {
final int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully created product
final Intent i = new Intent(getApplicationContext(), UserLogin.class);
startActivity(i);
//registerFine.setText("Error occured in registration");
// closing this screen
finish();
} else {
// failed to create product
}
} catch (final JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(final String file_url) {
// dismiss the dialog once done
FineCalc.this.pDialog.dismiss();
}
}
public void ShowFine(final View clickedButton) {
final double SpeedKMh = (Integer.parseInt(this.speed.getText().toString()));
final TextView Result=(TextView)findViewById(R.id.editText6);
if ((SpeedKMh>=80) && (SpeedKMh<=99)){
final double TotalFine = 50;
this.Fine.setText(new DecimalFormat("##.##").format(TotalFine));
Result.setText("Speeding");
}
else if ((SpeedKMh>=56) && (SpeedKMh<=79)) {
final double TotalFine = 25;
this.Fine.setText(new DecimalFormat("##.##").format(TotalFine));
Result.setText("Medium Speed");
}
else if ((SpeedKMh>=40) && (SpeedKMh<=55)) {
final double TotalFine = 0;
this.Fine.setText(new DecimalFormat("##.##").format(TotalFine));
Result.setText("Slow");
}
else if (SpeedKMh<=39) {
final double TotalFine = 0;
this.Fine.setText(new DecimalFormat("##.##").format(TotalFine));
Result.setText("Very Slow");
}
else if (SpeedKMh>=100) {
final double TotalFine = 100;
this.Fine.setText(new DecimalFormat("##.##").format(TotalFine));
Result.setText("Over Speeding");
}
}
// Register DatePickerDialog listener
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
// the callback received when the user "sets" the Date in the DatePickerDialog
public void onDateSet(DatePicker view, int yearSelected, int monthOfYear, int dayOfMonth) {
year = yearSelected;
month = monthOfYear+1;
day = dayOfMonth;
// Set the Selected Date in Select date Button
btnSelectDate.setText("Date selected: "+day+"/"+month+"/"+year);
}
};
// Register TimePickerDialog listener
private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
// the callback received when the user "sets" the TimePickerDialog in the dialog
public void onTimeSet(TimePicker view, int hourOfDay, int min) {
hour = hourOfDay;
minute = min;
// Set the Selected Date in Select date Button
btnSelectTime.setText("Time selected: "+hour+":"+minute);
}
};
// Method automatically gets Called when you call showDialog() method
@Override
protected Dialog onCreateDialog(final int id) {
switch (id) {
case DATE_DIALOG_ID:
// create a new DatePickerDialog with values you want to show
return new DatePickerDialog(this, this.mDateSetListener, this.mYear, this.mMonth, this.mDay);
// create a new TimePickerDialog with values you want to show
case TIME_DIALOG_ID:
return new TimePickerDialog(this, this.mTimeSetListener, this.mHour, this.mMinute, false);
}
return null;
}
}
08-03 18:25:50.288: E/JSON Parser(1190): Error parsing data org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject
08-03 18:25:50.298: E/AndroidRuntime(1190): FATAL EXCEPTION: AsyncTask #1
08-03 18:25:50.298: E/AndroidRuntime(1190): Process: com.finecalc.ltafinecalculator, PID: 1190
08-03 18:25:50.298: E/AndroidRuntime(1190): java.lang.RuntimeException: An error occured while executing doInBackground()
08-03 18:25:50.298: E/AndroidRuntime(1190): at android.os.AsyncTask$3.done(AsyncTask.java:300)
08-03 18:25:50.298: E/AndroidRuntime(1190): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
08-03 18:25:50.298: E/AndroidRuntime(1190): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
08-03 18:25:50.298: E/AndroidRuntime(1190): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
08-03 18:25:50.298: E/AndroidRuntime(1190): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-03 18:25:50.298: E/AndroidRuntime(1190): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-03 18:25:50.298: E/AndroidRuntime(1190): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-03 18:25:50.298: E/AndroidRuntime(1190): at java.lang.Thread.run(Thread.java:841)
08-03 18:25:50.298: E/AndroidRuntime(1190): Caused by: java.lang.NullPointerException
08-03 18:25:50.298: E/AndroidRuntime(1190): at com.finecalc.ltafinecalculator.FineCalc$CreateNewFine.doInBackground(FineCalc.java:187)
08-03 18:25:50.298: E/AndroidRuntime(1190): at com.finecalc.ltafinecalculator.FineCalc$CreateNewFine.doInBackground(FineCalc.java:1)
08-03 18:25:50.298: E/AndroidRuntime(1190): at android.os.AsyncTask$2.call(AsyncTask.java:288)
08-03 18:25:50.298: E/AndroidRuntime(1190): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-03 18:25:50.298: E/AndroidRuntime(1190): ... 4 more
08-03 18:25:51.628: E/WindowManager(1190): android.view.WindowLeaked: Activity com.finecalc.ltafinecalculator.FineCalc has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b3f08e18 V.E..... R......D 0,0-642,345} that was originally added here
08-03 18:25:51.628: E/WindowManager(1190): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:348)
08-03 18:25:51.628: E/WindowManager(1190): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
08-03 18:25:51.628: E/WindowManager(1190): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
08-03 18:25:51.628: E/WindowManager(1190): at android.app.Dialog.show(Dialog.java:286)
08-03 18:25:51.628: E/WindowManager(1190): at com.finecalc.ltafinecalculator.FineCalc$CreateNewFine.onPreExecute(FineCalc.java:158)
08-03 18:25:51.628: E/WindowManager(1190): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
08-03 18:25:51.628: E/WindowManager(1190): at android.os.AsyncTask.execute(AsyncTask.java:535)
08-03 18:25:51.628: E/WindowManager(1190): at com.finecalc.ltafinecalculator.FineCalc$5.onClick(FineCalc.java:139)
08-03 18:25:51.628: E/WindowManager(1190): at android.view.View.performClick(View.java:4438)
08-03 18:25:51.628: E/WindowManager(1190): at android.view.View$PerformClick.run(View.java:18422)
08-03 18:25:51.628: E/WindowManager(1190): at android.os.Handler.handleCallback(Handler.java:733)
08-03 18:25:51.628: E/WindowManager(1190): at android.os.Handler.dispatchMessage(Handler.java:95)
08-03 18:25:51.628: E/WindowManager(1190): at android.os.Looper.loop(Looper.java:136)
08-03 18:25:51.628: E/WindowManager(1190): at android.app.ActivityThread.main(ActivityThread.java:5017)
08-03 18:25:51.628: E/WindowManager(1190): at java.lang.reflect.Method.invokeNative(Native Method)
08-03 18:25:51.628: E/WindowManager(1190): at java.lang.reflect.Method.invoke(Method.java:515)
08-03 18:25:51.628: E/WindowManager(1190): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
08-03 18:25:51.628: E/WindowManager(1190): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
08-03 18:25:51.628: E/WindowManager(1190): at dalvik.system.NativeStart.main(Native Method)
According to your logs, your code is pointing NullPointerException
that's why JSONObject
is not parsed properly as it cannot parse empty data. So check your code that which part is giving NullPointerException
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.