Android 特定函数上存在未捕获异常的线程退出

Android 特定函数上存在未捕获异常的线程退出,android,mysql,exception,crash,Android,Mysql,Exception,Crash,我正在开发一个android应用程序,可以对本地托管的MySQL数据库上的数据执行添加、更新和删除操作。除了更新部分外,一切正常。当我试图更新数据时,它发生在活动ViewFeedingSched上。当按下更新按钮或只是调用更新功能时,应用程序崩溃。logcat发出一条消息:threadid=1:线程退出,但出现未捕获异常(组=0x41640c80)。我见过几种解决方案,它们主要是关于不初始化某些对象或具有空值。我似乎找不到我没有初始化的地方。它以前工作过,我不知道我对这个程序做了什么改变。下面是

我正在开发一个android应用程序,可以对本地托管的MySQL数据库上的数据执行添加、更新和删除操作。除了更新部分外,一切正常。当我试图更新数据时,它发生在活动
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);
    }
}