抛出Android的IndexOutOfBound异常 [英] IndexOutOfBound Exception throwing Android

查看:91
本文介绍了抛出Android的IndexOutOfBound异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经制作了一个android应用程序,因为数据来自服务器,因此它很耗时,所以我创建了一个进度对话框。.

i have make one android application in that data is coming from server so it's time consuming process so i have created one progress dialog box..

下面是我的代码

  @Override
protected void onResume() {
    super.onResume();
    if (placesListItems != null)
        placesListItems.clear();
    new LoadPlaces().execute();
}

@Override
public void onPause() {
    super.onPause();
    if (pDialog != null)
        pDialog.dismiss();
}


  class LoadPlaces extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage(Html.fromHtml("<b>Search</b><br/>Loading Places..."));
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }



  protected String doInBackground(String... args) {

        GooglePlaces googlePlaces = new GooglePlaces();

        try {
            double radius = 1000; // 10000 meters

            // get nearest places
            if (query != null) {
                nearPlaces = googlePlaces.search(lat, lon, radius, query);
                if (nearPlaces != null) {

                    for (Place p : nearPlaces.results) {
                        reference = p.reference;
                        lat = p.geometry.location.lat;
                        lon = p.geometry.location.lng;
                        break;
                    }
                }
            }

            String types = "bar|restaurant|night_club|gym|health|food|shopping_mall|hospital";

            if (reference != null) {
                PlaceDetails placeDetails = googlePlaces.getPlaceDetails(reference);
                if (placeDetails != null) {
                    String status = placeDetails.status;

                    // check place deatils status
                    // Check for all possible status
                    if (status.equals("OK")) {
                        if (placeDetails.result != null) {
                            lat = placeDetails.result.geometry.location.lat;
                            lon = placeDetails.result.geometry.location.lng;
                            nearDeals = googlePlaces.search(lat, lon, radius, types);

在下面的代码中,如果我在从服务器获取数据的过程中按了主页按钮或屏幕消失了(可以说进度对话框正在运行),如果我返回到我的应用程序,则会收到错误提示:数组索引超出界限

In below code if i press home button or screen goes of during fetching data from server (You can say progress dialog box is running) and if i come back to my application i got an error ARRAY INDEX OUT OF BOUND

                    // int total = ;
                            for (int i = nearDeals.results.size() - 1; i >= 0; i--) {
                                // Log.i("WHAT THE HELL",nearPlaces.results.get(i).name);
                                if (getResult(nearDeals.results.get(i).name, nearDeals.results.get(i).geometry.location.lat,
                                        nearDeals.results.get(i).geometry.location.lng) == 0) {
                                    // nearDeals.results.add(nearPlaces.results.get(i));
                                    nearDeals.results.remove(i);

                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

下面是logcat

  09-25 18:23:13.429: W/System.err(4375): java.lang.IndexOutOfBoundsException: Invalid index 15, size is 15
  09-25 18:23:13.429: W/System.err(4375):   at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
  09-25 18:23:13.429: W/System.err(4375):   at java.util.ArrayList.get(ArrayList.java:311)
  09-25 18:23:13.429: W/System.err(4375):   at com.eheuristics.android.diegodeals.googleplacesandmaps.MainActivity$LoadPlaces.doInBackground(MainActivity.java:204)
  09-25 18:23:13.429: W/System.err(4375):   at com.eheuristics.android.diegodeals.googleplacesandmaps.MainActivity$LoadPlaces.doInBackground(MainActivity.java:1)
  09-25 18:23:13.429: W/System.err(4375):   at android.os.AsyncTask$2.call(AsyncTask.java:185)
  09-25 18:23:13.439: W/System.err(4375):   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
  09-25 18:23:13.439: W/System.err(4375):   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
  09-25 18:23:13.439: W/System.err(4375):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
  09-25 18:23:13.439: W/System.err(4375):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
  09-25 18:23:13.439: W/System.err(4375):   at java.lang.Thread.run(Thread.java:1019)

如果我不按Home键,或者在进度对话框运行期间屏幕不熄灭,则说明一切正常

if i do not press home key, or do not screen goes off during progress dialog box is running then everything is working fine

///从所有人那里获得解决方案后,我像所有建议一样完成了打击,但是又遇到了另一个打击,例如

//After getting solution from all of you, i have done blow like all suggest but i got another error like blow

    LoadPlaces ob;


    protected void onResume() {
    super.onResume();
    if (placesListItems != null)
        placesListItems.clear();
    ob.execute();
}

@Override
public void onPause() {
    super.onPause();
    if(ob!=null)
    if(ob.getStatus() == AsyncTask.Status.RUNNING){
       ob.cancel(true);
    }

    if (pDialog != null)
        pDialog.dismiss();
}

然后我得到如下错误

   09-25 18:53:30.609: E/AndroidRuntime(4674): java.lang.RuntimeException: Unable to resume activity {com.eheuristics.android.diegodeals/com.eheuristics.android.diegodeals.googleplacesandmaps.MainActivity}: java.lang.IllegalStateException: Cannot execute task: the task is already running.
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2241)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2256)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at android.os.Handler.dispatchMessage(Handler.java:99)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at android.os.Looper.loop(Looper.java:130)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at android.app.ActivityThread.main(ActivityThread.java:3835)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at java.lang.reflect.Method.invokeNative(Native Method)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at java.lang.reflect.Method.invoke(Method.java:507)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at dalvik.system.NativeStart.main(Native Method)
  09-25 18:53:30.609: E/AndroidRuntime(4674): Caused by: java.lang.IllegalStateException: Cannot execute task: the task is already running.
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at android.os.AsyncTask.execute(AsyncTask.java:380)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at com.eheuristics.android.diegodeals.googleplacesandmaps.MainActivity.onResume(MainActivity.java:137)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
  09-25  18:53:30.609: E/AndroidRuntime(4674):  at android.app.Activity.performResume(Activity.java:3832)
  09-25  18:53:30.609: E/AndroidRuntime(4674):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2231)
  09-25 18:53:30.609: E/AndroidRuntime(4674):   ... 10 more


推荐答案

您正在启动asynctask每次显示活动时。因此,您应该在退出(AsyncTask.cancel(true))时取消任务,或者检查它是否仍在onResume方法中运行。

You are starting the asynctask every time you show your activity. So, you should cancel the task when exiting (AsyncTask.cancel(true)), or check if it is still running in the onResume method.

这篇关于抛出Android的IndexOutOfBound异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆