如果长时间运行的循环正在工作,AsyncTask不会停止?

时间:2011-06-03 10:24:31

标签: android runnable

朋友,

我在asyncTask中使用以下代码

公共类AsycLoaderFromDbAndMapInjector扩展了AsyncTask     {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();


    }




   @Override
    protected Boolean doInBackground(Void... arg0) {
         Log.d("Asynctask", ""+arg0);  

                boolean show = false;
                if(db == null)
                db = new dbHelper(me);

                ATM results = null;
                try {
                 results = db.getAtmsBySelectedBanks(atm.getSelectedBankList(), selectedCity);
                 if (results != null) {
                        LoopThroughEachATMToDisplayOnMap();
                    }

            return show;

    }


   @Override
    protected void onPostExecute(Boolean result) {
       stopProgress();
    }

private void LoopThroughEachATMToDisplayOnMap()        {

       Drawable drawable = getResources().getDrawable(
                R.drawable.marker);
        itemizedOverlay = new MyItemizedOverlay(drawable, mapView);

        for (int i = 0; i < atm.getAtmList().size(); i++) {

            ATM a = atm.getAtmList().get(i);
            if (a != null) {
                int[] coordinates = getIntCoordinates(a
                        .getCoordinates());
                if (coordinates != null) {
                    GeoPoint point = new GeoPoint(coordinates[0],
                            coordinates[1]);
                    OverlayItem overlayItem = new OverlayItem(
                            point, a.getBankName(), a.getAddress()
                                    + "@@" + a.getPhone() + "@@"
                                    + a.getWebAddress() + "@@"
                                    + a.getCoordinates());
                    itemizedOverlay.addOverlay(overlayItem);
                    System.out
                            .println("coordinates-------------------------"
                                    + i + " "
                                    + coordinates[0]
                                    + ","
                                    + coordinates[1]);
                }

            }

        }


   }


}

现在当我按下后退按钮时,这个可运行的populate继续在我使用的后端运行

关于backbuttonpressed事件的AsyncTask.cancel()但是它仍在运行任何一个指导我如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您需要明确地为您的populate runnable提供一种检测您不希望它完成的方法。通常人们会为此使用Thread.interrupt(),但是因为你的代码没有完全控制在这里可能不是一个好主意的UI线程。

答案 1 :(得分:0)

试试这个,

 private ATM results = null;
     @Override
        protected Boolean doInBackground(Void... arg0) {
             Log.d("Asynctask", ""+arg0);  

                    boolean show = false;
                    if(db == null)
                    db = new dbHelper(me);

                    ATM results = null;
                    try {
                     results = db.getAtmsBySelectedBanks(atm.getSelectedBankList(), selectedCity);
                     if (results != null) {
                            publishProgress(0);
                      }

                return show;

        }



     @Override
            protected void onProgressUpdate(Integer... values) {
                    if (results != null) {
                        LoopThroughEachATMToDisplayOnMap();
                    }
            }

在LoopThroughEachATMToDisplayOnMap()中设置一个标志,以便在按下后退按钮时停止for循环。

即,

检测何时按下后退按钮,设置条件变量。

在循环方法中有一个条件变量会破坏for循环。