Android ListView中的数据库错误:应用程序已停止

Android ListView中的数据库错误:应用程序已停止,android,listview,android-asynctask,Android,Listview,Android Asynctask,我有一个ListView,其中我从Android中的MySQL数据库加载所有项目,并显示这些项目。由于列表需要更新,在活动中,我使用Asynctask函数每隔15秒刷新一次列表,并更新ListView。还有一个滚动条,因为可能有很多项目,这里是错误发生的地方。如果我通过滚动条向上或向下移动,它运行良好。但是,如果我正在使用滚动条,同时活动尝试访问数据库以加载更新的项目,则应用程序将停止 以下是日志: 06-23 15:36:32.867: E/AndroidRuntime(7788): F

我有一个ListView,其中我从Android中的MySQL数据库加载所有项目,并显示这些项目。由于列表需要更新,在活动中,我使用Asynctask函数每隔15秒刷新一次列表,并更新ListView。还有一个滚动条,因为可能有很多项目,这里是错误发生的地方。如果我通过滚动条向上或向下移动,它运行良好。但是,如果我正在使用滚动条,同时活动尝试访问数据库以加载更新的项目,则应用程序将停止

以下是日志:

   06-23 15:36:32.867: E/AndroidRuntime(7788): FATAL EXCEPTION: main
    06-23 15:36:32.867: E/AndroidRuntime(7788): java.lang.IndexOutOfBoundsException: Invalid index 14, size is 0
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at java.util.ArrayList.get(ArrayList.java:304)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:147)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:126)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.widget.SimpleAdapter.getView(SimpleAdapter.java:114)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.widget.AbsListView.obtainView(AbsListView.java:2445)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.widget.ListView.makeAndAddView(ListView.java:1769)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.widget.ListView.fillUp(ListView.java:706)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.widget.ListView.fillGap(ListView.java:645)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5530)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3509)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.widget.AbsListView.onTouchEvent(AbsListView.java:3906)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.View.dispatchTouchEvent(View.java:7340)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2179)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1914)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1928)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1928)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1928)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1928)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2185)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1928)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2113)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1466)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.app.Activity.dispatchTouchEvent(Activity.java:2468)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2061)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.View.dispatchPointerEvent(View.java:7525)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3368)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3300)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4392)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4370)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4474)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:163)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4442)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4493)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.Choreographer.doCallbacks(Choreographer.java:555)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.Choreographer.doFrame(Choreographer.java:523)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.os.Handler.handleCallback(Handler.java:615)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.os.Handler.dispatchMessage(Handler.java:92)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.os.Looper.loop(Looper.java:137)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at android.app.ActivityThread.main(ActivityThread.java:4895)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at java.lang.reflect.Method.invokeNative(Native Method)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at java.lang.reflect.Method.invoke(Method.java:511)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
    06-23 15:36:32.867: E/AndroidRuntime(7788):     at dalvik.system.NativeStart.main(Native Method)
谢谢你的帮助

编辑:下面是我用来每隔15秒刷新Listview的代码: @凌驾

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.all_candidatos);
        StrictMode.ThreadPolicy policy = new StrictMode. ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);

        boolean isReachable = false;
        try{
            isReachable = InetAddress.getByName("192.168.1.41").isReachable(200);
        } catch (Exception e){
            Log.e("InetAddress", e.getMessage());




        }finally {
            if (isReachable) {

                new CargarCandidatos().execute();
        timer();


            }else{
                Toast.makeText(getApplicationContext(), R.string.errorserver, Toast.LENGTH_LONG).show();
            }

        }
        setListAdapter(adapter);

        candidatosList = new ArrayList<HashMap<String, String>>();



    }
//
//  
    public void timer(){
         new CountDownTimer(tiempo, 1000) {

                public void onTick(long millisUntilFinished) {

                }

                public void onFinish() {
                    candidatosList.clear();
                    new CargarCandidatos().execute();


                    timer();

                }
             }.start();}




    class CargarCandidatos extends AsyncTask<String, Void, String> {


        @Override
        protected void onPreExecute() {
            if(!isFinishing()){
            super.onPreExecute();
            pDialog = new ProgressDialog(Monitorizacion.this);
            pDialog.setMessage("Monitorizando ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }
        }


        protected String doInBackground(String... args) {




                try {
                    monitorizar();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();}
                return null;




        }


        protected void onPostExecute(String file_url) {
    pDialog.dismiss();
            runOnUiThread(new Runnable() {
                public void run() {

                    adapter = new SimpleAdapter(
                            Monitorizacion.this, candidatosList,
                            R.layout.list_item, new String[] { TAG_NSERIE,
                                    TAG_DNI, TAG_NOMBRE, TAG_TEST, TAG_PREGUNTA, TAG_BATERIA,TAG_CORRECTAS, TAG_ERRORES},
                            new int[] { R.id.id, R.id.dni, R.id.nombre, R.id.test, R.id.pregunta, R.id.bateria, R.id.correctas, R.id.fallos});

                    adapter.notifyDataSetChanged();
                    setListAdapter(adapter);


                }
            });

        }

    }
    public void monitorizar() throws Exception{
        try {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            JSONObject json = jParser.makeHttpRequest(url_candidatos, "GET", params);
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {

                candidatos = json.getJSONArray(TAG_CANDIDATOS);

                for (int i = 0; i < candidatos.length(); i++) {
                    JSONObject c = candidatos.getJSONObject(i);

                    String nserie = c.getString(TAG_NSERIE);
                    String dni = c.getString(TAG_DNI);
                    String nombre = c.getString(TAG_NOMBRE);
                    String test = c.getString(TAG_TEST);
                    String pregunta = c.getString(TAG_PREGUNTA);
                    String bateria = c.getString(TAG_BATERIA);
                    String correctas = c.getString(TAG_CORRECTAS);
                    String errores = c.getString(TAG_ERRORES);

                    HashMap<String, String> map = new HashMap<String, String>();

                    map.put(TAG_NSERIE, nserie);
                    map.put(TAG_DNI, dni);
                    map.put(TAG_NOMBRE, nombre);
                    map.put(TAG_TEST, test);
                    map.put(TAG_PREGUNTA, pregunta);
                    map.put(TAG_BATERIA, bateria);
                    map.put(TAG_CORRECTAS, correctas);
                    map.put(TAG_ERRORES, errores);
                    candidatosList.add(map);
                }
            } 
        } catch (JSONException e) {
            e.printStackTrace();
        }



    }
}
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局,所有候选对象);
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(策略);
布尔值isReachable=false;
试一试{
isReachable=InetAddress.getByName(“192.168.1.41”)。isReachable(200);
}捕获(例外e){
Log.e(“InetAddress”,e.getMessage());
}最后{
如果(isReachable){
新的CargarCandidatos().execute();
定时器();
}否则{
Toast.makeText(getApplicationContext(),R.string.errorserver,Toast.LENGTH\u LONG.show();
}
}
setListAdapter(适配器);
CandidatesList=新的ArrayList();
}
//
//  
公共无效计时器(){
新的倒计时器(tiempo,1000){
公共void onTick(长毫秒未完成){
}
公共无效onFinish(){
candidateList.clear();
新的CargarCandidatos().execute();
定时器();
}
}.start();}
类CargarCandidatos扩展了异步任务{
@凌驾
受保护的void onPreExecute(){
如果(!isFinishing()){
super.onPreExecute();
pDialog=新建进度对话框(Monitorizacion.this);
setMessage(“Monitorizando…”);
pDialog.setUndeterminate(假);
pDialog.setCancelable(假);
pDialog.show();
}
}
受保护的字符串doInBackground(字符串…args){
试一试{
monitorizar();
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();}
返回null;
}
受保护的void onPostExecute(字符串文件\u url){
pDialog.disclose();
runOnUiThread(新的Runnable(){
公开募捐{
适配器=新的SimpleAdapter(
这个,候选人名单,
R.layout.list_项,新字符串[]{TAG_NSERIE,
标记DNI、标记NOMBRE、标记TEST、标记PREGUNTA、标记BATERIA、标记CORPORTAS、标记ERRORS},
新int[]{R.id.id,R.id.dni,R.id.nombre,R.id.test,R.id.pregunta,R.id.bateria,R.id.correctas,R.id.fallos});
adapter.notifyDataSetChanged();
setListAdapter(适配器);
}
});
}
}
public void monitorizar()引发异常{
试一试{
List params=new ArrayList();
JSONObject json=jParser.makeHttpRequest(url_candidates,“GET”,params);
int success=json.getInt(TAG_success);
如果(成功==1){
candidateos=json.getJSONArray(TAG_candidateos);
对于(int i=0;i
编辑: 问题是,如果我向上或向下滚动Listview,此时调用asynctask函数访问数据库,则会发生错误,应用程序停止

Michael Butscher解决方案: 根据我的理解,我用迈克尔·布彻的建议解决了这个问题:

    public void timer(){
         new CountDownTimer(tiempo, 1000) {

                public void onTick(long millisUntilFinished) {

                }

                public void onFinish() {
                    new CargarCandidatos().execute();


                    timer();

                }
             }.start();}




    class CargarCandidatos extends AsyncTask<String, Void, String> {


        @Override
        protected void onPreExecute() {
            if(!isFinishing()){
            super.onPreExecute();
            pDialog = new ProgressDialog(Monitorizacion.this);
            pDialog.setMessage("Monitorizando ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }
        }


        protected String doInBackground(String... args) {




                try {
                    monitorizar();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();}
                return null;




        }


        protected void onPostExecute(String file_url) {
    pDialog.dismiss();
            runOnUiThread(new Runnable() {
                public void run() {

                    adapter = new SimpleAdapter(
                            Monitorizacion.this, candidatosList,
                            R.layout.list_item, new String[] { TAG_NSERIE,
                                    TAG_DNI, TAG_NOMBRE, TAG_TEST, TAG_PREGUNTA, TAG_BATERIA,TAG_CORRECTAS, TAG_ERRORES},
                            new int[] { R.id.id, R.id.dni, R.id.nombre, R.id.test, R.id.pregunta, R.id.bateria, R.id.correctas, R.id.fallos});

                    adapter.notifyDataSetChanged();
                    setListAdapter(adapter);



                }
            });

        }

    }
    public void monitorizar() throws Exception{
        try {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            JSONObject json = jParser.makeHttpRequest(url_candidatos, "GET", params);
            ArrayList<HashMap<String, String>> temp;
            temp = new ArrayList<HashMap<String, String>>();


            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {

                candidatos = json.getJSONArray(TAG_CANDIDATOS);

                for (int i = 0; i < candidatos.length(); i++) {
                    JSONObject c = candidatos.getJSONObject(i);

                    String nserie = c.getString(TAG_NSERIE);
                    String dni = c.getString(TAG_DNI);
                    String nombre = c.getString(TAG_NOMBRE);
                    String test = c.getString(TAG_TEST);
                    String pregunta = c.getString(TAG_PREGUNTA);
                    String bateria = c.getString(TAG_BATERIA);
                    String correctas = c.getString(TAG_CORRECTAS);
                    String errores = c.getString(TAG_ERRORES);

                    HashMap<String, String> map = new HashMap<String, String>();

                    map.put(TAG_NSERIE, nserie);
                    map.put(TAG_DNI, dni);
                    map.put(TAG_NOMBRE, nombre);
                    map.put(TAG_TEST, test);
                    map.put(TAG_PREGUNTA, pregunta);
                    map.put(TAG_BATERIA, bateria);
                    map.put(TAG_CORRECTAS, correctas);
                    map.put(TAG_ERRORES, errores);
                    temp.add(map);
                    candidatosList = temp;
                }
            } 
        } catch (JSONException e) {
            e.printStackTrace();
        }



    }
}
公共无效计时器(){
新的倒计时器(tiempo,1000){
公共void onTick(长毫秒未完成){
}
公共无效onFinish(){
新的CargarCandidatos().execute();
定时器();
}
}.start();}
类CargarCandidatos扩展了异步任务{
@凌驾
受保护的void onPreExecute(){
如果(!isFinishing()){
super.onPreExecute();
pDialog=新建进度对话框(Monitorizacion.this);
setMessage(“Monitorizando…”);
pDialog.setUndeterminate(假);
pDialog.se