Android 特定函数上存在未捕获异常的线程退出
我正在开发一个android应用程序,可以对本地托管的MySQL数据库上的数据执行添加、更新和删除操作。除了更新部分外,一切正常。当我试图更新数据时,它发生在活动Android 特定函数上存在未捕获异常的线程退出,android,mysql,exception,crash,Android,Mysql,Exception,Crash,我正在开发一个android应用程序,可以对本地托管的MySQL数据库上的数据执行添加、更新和删除操作。除了更新部分外,一切正常。当我试图更新数据时,它发生在活动ViewFeedingSched上。当按下更新按钮或只是调用更新功能时,应用程序崩溃。logcat发出一条消息:threadid=1:线程退出,但出现未捕获异常(组=0x41640c80)。我见过几种解决方案,它们主要是关于不初始化某些对象或具有空值。我似乎找不到我没有初始化的地方。它以前工作过,我不知道我对这个程序做了什么改变。下面是
ViewFeedingSched
上。当按下更新按钮或只是调用更新功能时,应用程序崩溃。logcat发出一条消息:threadid=1:线程退出,但出现未捕获异常(组=0x41640c80)
。我见过几种解决方案,它们主要是关于不初始化某些对象或具有空值。我似乎找不到我没有初始化的地方。它以前工作过,我不知道我对这个程序做了什么改变。下面是ViewFeedingSched
类的代码
编辑
我为类添加了代码,该类位于ViewFeedingSched
类之前,该类是FeedingSchedList
类。它的布局包含一个列出数据的ListView和一个onItemClick方法,每当单击一个项目(数据)时,该方法就会打开ViewFeedingSched
类
public class ViewFeedingSched extends AppCompatActivity implements View.OnClickListener {
private EditText editTextSchedNo;
private EditText editTextFeedTime;
private EditText editTextFeedAmt;
private TextView textViewCurrentTimeSet;
private TextView textViewIDSelected;
//private TextView textViewCurrentAmtSet;
private NumberPicker numPickerHr;
private NumberPicker numPickerMin;
//private Spinner spinnerFeedAmt;
ArrayAdapter<CharSequence> adapter;
private Button buttonUpdate;
private Button buttonDelete;
private String id;
private String ftime;
// private String famt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_feeding_sched);
Intent intent = getIntent();
id = intent.getStringExtra(Config.SCHED_ID);
ftime = intent.getStringExtra(Config.FEEDTIME);
//famt = intent.getStringExtra(Config.FEEDAMT);
editTextSchedNo = (EditText) findViewById(R.id.ET_SchedNo);
editTextFeedTime = (EditText) findViewById(R.id.ET_FeedTime);
//editTextFeedAmt = (EditText) findViewById(R.id.ET_FeedAmt);
textViewCurrentTimeSet = (TextView) findViewById(R.id.TV_CurrentTimeSet);
textViewIDSelected = (TextView) findViewById(R.id.TV_PickedSchedID);
//textViewCurrentAmtSet = (TextView) findViewById(R.id.TV_CurrentAmountSet);
buttonUpdate = (Button) findViewById(R.id.BT_UpdateSched);
buttonDelete = (Button) findViewById(R.id.BT_DeleteSched);
buttonUpdate.setOnClickListener(this);
buttonDelete.setOnClickListener(this);
textViewIDSelected.setText(id);
textViewCurrentTimeSet.setText(ftime);
//textViewCurrentAmtSet.setText(famt);
numPickerHr = (NumberPicker) findViewById(R.id.NP_Hour);
numPickerHr.setMinValue(0);
numPickerHr.setMaxValue(23);
numPickerHr.setWrapSelectorWheel(true);
numPickerMin = (NumberPicker) findViewById(R.id.NP_Min);
numPickerMin.setMinValue(0);
numPickerMin.setMaxValue(59);
numPickerMin.setWrapSelectorWheel(true);
//spinnerFeedAmt = (Spinner) findViewById(R.id.SP_FeedAmt);
//adapter = ArrayAdapter.createFromResource(this,R.array.FeedAmt,android.R.layout.simple_spinner_item);
//spinnerFeedAmt.setAdapter(adapter);
getSchedule();
}
private void getSchedule(){
class GetSchedule extends AsyncTask<Void,Void,String>{
ProgressDialog loading;
@Override
protected void onPreExecute() {
super.onPreExecute();
loading = ProgressDialog.show(ViewFeedingSched.this,"Fetching...","Wait...",false,false);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
showSchedule(s);
}
@Override
protected String doInBackground(Void... params) {
RequestHandler rh = new RequestHandler();
String s = rh.sendGetRequestParam(Config.URL_GET_SCHED,id);
return s;
}
}
GetSchedule ge = new GetSchedule();
ge.execute();
}
private void showSchedule(String json){
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);
JSONObject c = result.getJSONObject(0);
String feedtime = c.getString(Config.TAG_FEEDTIME);
String feedamt = c.getString(Config.TAG_FEEDAMT);
//editTextFeedTime.setText(feedtime);
// editTextFeedAmt.setText(feedamt);
textViewCurrentTimeSet.setText(feedtime);
// String spinnerVal = String.valueOf(spinnerFeedAmt.getSelectedItem().toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
private void updateSchedule(){
final String feedtime = editTextFeedTime.getText().toString().trim();
final String feedamt = editTextFeedAmt.getText().toString().trim();
final String NP_FeedTime_HR = String.valueOf(numPickerHr.getValue()).trim();
final String NP_FeedTime_MIN = String.valueOf(numPickerMin.getValue()).trim();
//final String SP_FeedAmt = spinnerFeedAmt.getSelectedItem().toString().trim();
class UpdateSchedule extends AsyncTask<Void,Void,String>{
ProgressDialog loading;
@Override
protected void onPreExecute() {
super.onPreExecute();
loading = ProgressDialog.show(ViewFeedingSched.this,"Updating...","Wait...",false,false);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
Toast.makeText(ViewFeedingSched.this,s,Toast.LENGTH_LONG).show();
}
@Override
protected String doInBackground(Void... params) {
HashMap<String,String> hashMap = new HashMap<>();
hashMap.put(Config.KEY_SCHED_ID,id);
hashMap.put(Config.KEY_FEED_TIME,NP_FeedTime_HR+":"+NP_FeedTime_MIN+":00");
hashMap.put(Config.KEY_FEED_AMT,feedamt);
RequestHandler rh = new RequestHandler();
String s = rh.sendPostRequest(Config.URL_UPDATE_SCHED,hashMap);
return s;
}
}
UpdateSchedule ue = new UpdateSchedule();
ue.execute();
}
private void deleteSchedule(){
class DeleteSchedule extends AsyncTask<Void,Void,String> {
ProgressDialog loading;
@Override
protected void onPreExecute() {
super.onPreExecute();
loading = ProgressDialog.show(ViewFeedingSched.this, "Updating...", "Wait...", false, false);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
Toast.makeText(ViewFeedingSched.this, s, Toast.LENGTH_LONG).show();
}
@Override
protected String doInBackground(Void... params) {
RequestHandler rh = new RequestHandler();
String s = rh.sendGetRequestParam(Config.URL_DELETE_SCHED, id);
return s;
}
}
DeleteSchedule de = new DeleteSchedule();
de.execute();
}
private void confirmDeleteSchedule(){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage("Are you sure you want to delete this schedule?");
alertDialogBuilder.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
deleteSchedule();
startActivity(new Intent(ViewFeedingSched.this,FeedingScheduleList.class));
}
});
alertDialogBuilder.setNegativeButton("No",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
@Override
public void onClick(View v) {
if(v == buttonUpdate){
updateSchedule();
}
if(v == buttonDelete){
confirmDeleteSchedule();
}
}
}
公共类ViewFeedingSched扩展AppCompativeActivity实现View.OnClickListener{
私有EditText editTextSchedNo;
私有EditText editTextFeedTime;
私有EditText editTextFeedAmt;
私有文本视图文本视图当前时间集;
选择私有文本视图文本视图ID;
//私有文本视图文本视图当前AMTSET;
私人电话号码簿;
私人电话号码icker numPickerMin;
//私人纺纱机;
阵列适配器;
私人按钮更新;
私人按钮删除;
私有字符串id;
私有字符串ftime;
//私有字符串famt;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.view\u feed\u sched);
Intent=getIntent();
id=intent.getStringExtra(Config.SCHED_id);
ftime=intent.getStringExtra(Config.FEEDTIME);
//famt=intent.getStringExtra(Config.FEEDAMT);
editTextSchedNo=(EditText)findViewById(R.id.ET_SchedNo);
editTextFeedTime=(EditText)findViewById(R.id.ET_FeedTime);
//editTextFeedAmt=(EditText)findViewById(R.id.ET_FeedAmt);
textViewCurrentTimeSet=(TextView)findViewById(R.id.TV\u CurrentTimeSet);
textViewIDSelected=(TextView)findViewById(R.id.TV_PickedSchedID);
//textViewCurrentAmtSet=(TextView)findViewById(R.id.TV\u CurrentAmountSet);
buttonUpdate=(Button)findViewById(R.id.BT_UpdateSched);
buttonDelete=(按钮)findViewById(R.id.BT_DeleteSched);
buttonUpdate.setOnClickListener(此);
buttonDelete.setOnClickListener(此);
textViewIDSelected.setText(id);
textViewCurrentTimeSet.setText(ftime);
//textViewCurrentAmtSet.setText(famt);
numPickerHr=(NumberPicker)findviewbyd(R.id.NP\u小时);
numPickerHr.setMinValue(0);
numPickerHr.setMaxValue(23);
numPickerHr.setWrapSelectorWheel(真);
numPickerMin=(NumberPicker)findViewById(R.id.NP_Min);
numPickerMin.setMinValue(0);
numPickerMin.setMaxValue(59);
numPickerMin.setWrapSelectorWheel(真);
//spinnerFeedAmt=(Spinner)findViewById(R.id.SP_FeedAmt);
//adapter=ArrayAdapter.createFromResource(这个,R.array.FeedAmt,android.R.layout.simple\u微调器\u项);
//喷丝头进给量设置适配器(适配器);
getSchedule();
}
私人计划表(){
类GetSchedule扩展了异步任务{
对话加载;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
loading=ProgressDialog.show(ViewFeedingSched.this,“正在获取…”,“等待…”,false,false);
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
loading.dispose();
展览时间表;
}
@凌驾
受保护字符串doInBackground(无效…参数){
RequestHandler rh=新的RequestHandler();
字符串s=rh.sendGetRequestParam(Config.URL\u GET\u SCHED,id);
返回s;
}
}
GetSchedule ge=新的GetSchedule();
ge.execute();
}
私有void showSchedule(字符串json){
试一试{
JSONObject JSONObject=新的JSONObject(json);
JSONArray result=jsonObject.getJSONArray(Config.TAG\u JSON\u数组);
JSONObject c=result.getJSONObject(0);
String feedtime=c.getString(Config.TAG\u feedtime);
String feedamt=c.getString(Config.TAG\u feedamt);
//editTextFeedTime.setText(feedtime);
//editTextFeedAmt.setText(feedamt);
textViewCurrentTimeSet.setText(feedtime);
//String spinnerVal=String.valueOf(spinnerFeedAmt.getSelectedItem().toString());
}捕获(JSONException e){
e、 printStackTrace();
}
}
私有void updateSchedule(){
最终字符串feedtime=editTextFeedTime.getText().toString().trim();
最终字符串feedamt=editTextFeedAmt.getText().toString().trim();
最终字符串NP_FeedTime_HR=String.valueOf(numPickerHr.getValue()).trim();
最终字符串NP_FeedTime_MIN=String.valueOf(numPickerMin.getValue()).trim();
//最终字符串SP_FeedAmt=喷丝头FeedAmt.getSelectedItem().toString().trim();
类UpdateSchedule扩展了异步任务{
对话加载;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
loading=ProgressDialog.show(ViewFeedingSched.this,“Update…”,“Wait…”,false,false);
}
@结束
FeedingSchedList class
public class FeedingScheduleList extends AppCompatActivity implements ListView.OnItemClickListener{
private ListView listView;
private String JSON_STRING;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.feeding_schedule_list);
listView = (ListView) findViewById(R.id.FeedSchedListView);
listView.setOnItemClickListener(this);
getJSON();
}
private void showFeedSched(){
JSONObject jsonObject = null;
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String, String>>();
try {
jsonObject = new JSONObject(JSON_STRING);
JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);
for(int i = 0; i<result.length(); i++){
JSONObject jo = result.getJSONObject(i);
String id = jo.getString(Config.TAG_ID);
String feedtime = jo.getString(Config.TAG_FEEDTIME);
String feedamt = jo.getString(Config.TAG_FEEDAMT);
HashMap<String,String> schedules = new HashMap<>();
schedules.put(Config.TAG_ID,id+" ");
schedules.put(Config.TAG_FEEDTIME,feedtime+" ");
schedules.put(Config.TAG_FEEDAMT,feedamt+" ");
list.add(schedules);
}
} catch (JSONException e) {
e.printStackTrace();
}
ListAdapter adapter = new SimpleAdapter(
FeedingScheduleList.this, list, R.layout.list_item,
new String[]{Config.TAG_ID,Config.TAG_FEEDTIME,Config.TAG_FEEDAMT},
new int[]{R.id.SchedID, R.id.FeedSchedTime,R.id.FeedAmt});
listView.setAdapter(adapter);
}
private void getJSON() {
class GetJSON extends AsyncTask<Void, Void, String> {
ProgressDialog loading;
@Override
protected void onPreExecute() {
super.onPreExecute();
loading = ProgressDialog.show(FeedingScheduleList.this, "Fetching Data", "Wait...", false, false);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
JSON_STRING = s;
showFeedSched();
}
@Override
protected String doInBackground(Void... params) {
RequestHandler rh = new RequestHandler();
String s = rh.sendGetRequest(Config.URL_GET_ALL);
return s;
}
}
GetJSON gj = new GetJSON();
gj.execute();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(this, ViewFeedingSched.class);
HashMap<String,String> map =(HashMap)parent.getItemAtPosition(position);
String schedID = map.get(Config.TAG_ID).toString();
String feedTime = map.get(Config.TAG_FEEDTIME).toString();
//String feedAmt = map.get(Config.TAG_FEEDAMT).toString();
intent.putExtra(Config.SCHED_ID,schedID);
intent.putExtra(Config.FEEDTIME,feedTime);
//intent.putExtra(Config.FEEDAMT,feedAmt);
startActivity(intent);
}
}