编辑:ProgressDialog dismiss()被忽略

时间:2013-12-13 17:05:05

标签: android android-listview android-asynctask progressdialog

我正在构建一个应用程序,它显示listView上的项目,包括描述,品牌,价格和图像。通过下载JSON文件来填充listView。下载图像后,进度对话框不会消失,应用程序会冻结。我需要ProgressDialog以避免用户在下载图像之前单击一个单元格。我找了一个解决方案,但没有找到答案。 编辑: 我没有错误或例外,屏幕上出现 TOAST 。 我实现进度对话框的代码:

public class ListViewCategory extends Activity {

    private int jsonLength = 0;
    private int control = 0;
    private ProgressDialog waitingDialog;
    ListView mListView;
     String strUrl;
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_category_layout);    

        // URL to the JSON data
        Intent iN = getIntent();
        Bundle b = iN.getExtras();
        if (b!=null){
            strUrl=(String)b.get("urlJSON");
        }

        // Creating a new non-ui thread task to download json data 
        DownloadTask downloadTask = new DownloadTask();

        // Starting the download process
        downloadTask.execute(strUrl);

        // Getting a reference to ListView of activity_main
        mListView = (ListView) findViewById(R.id.list);

    mListView.setOnItemClickListener(new OnItemClickListener(){
            public void onItemClick(AdapterView<?> parent, View view, int position, long id){
                …
            }
        });


    }



    /** A method to download json data from url */
    private String downloadUrl(String strUrl) throws IOException{
        String data = "";
        InputStream iStream = null;
        try{
                URL url = new URL(strUrl);

                // Creating an http connection to communicate with url 
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                // Connecting to url 
                urlConnection.connect();

                // Reading data from url 
                iStream = urlConnection.getInputStream();

                BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

                StringBuffer sb  = new StringBuffer();

                String line = "";
                while( ( line = br.readLine())  != null){
                    sb.append(line);
                }

                data = sb.toString();

                br.close();

        }catch(Exception e){
                Log.d("Exception while downloading url", e.toString());
        }finally{
                iStream.close();
        }

        return data;
    }



    /** AsyncTask to download json data */
    private class DownloadTask extends AsyncTask<String, Integer, String>{
        String data = null;

                @Override
                protected String doInBackground(String... url) {
                        try{
                            data = downloadUrl(url[0]);

                        }catch(Exception e){
                            Log.d("Background Task",e.toString());
                        }
                        return data;
                }

                @Override
                protected void onPostExecute(String result) {

                        // The parsing of the xml data is done in a non-ui thread 
                        ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask();

                        // Start parsing xml data
                        listViewLoaderTask.execute(result);                        

                }
    }

    /** AsyncTask to parse json data and load ListView */
    private class ListViewLoaderTask extends AsyncTask<String, Void, SimpleAdapter>{



        JSONObject jObject;

        // Doing the parsing of xml data in a non-ui thread 
        @Override
        protected SimpleAdapter doInBackground(String... strJson) {
            try{
                jObject = new JSONObject(strJson[0]);
                JSONParser jsonParser = new JSONParser();
                    jsonParser.parse(jObject);
            }catch(Exception e){
                Log.d("JSON Exception1",e.toString());
            }

            // Instantiating json parser class
            JSONParser jsonParser = new JSONParser();

            // A list object to store the parsed countries list
            List<HashMap<String, Object>> brands = null;

            try{
                // Getting the parsed data as a List construct
                brands = jsonParser.parse(jObject);
            }catch(Exception e){
                Log.d("Exception",e.toString());
            }          

            // Keys used in Hashmap 
             String[] from = { "foto","marca","modelo","precio","foto"};

            // Ids of views in list_v layout
            int[] to = { R.id.fotos,R.id.marcas,R.id.modelos,R.id.precios,R.id.tvUrl};

            // Instantiating an adapter to store each items
            // R.layout.list_v defines the layout of each item          
            SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), brands, R.layout.list_v, from, to);  

            return adapter;
        }

        /** Invoked by the Android on "doInBackground" is executed */


        @Override
        protected void onPostExecute(SimpleAdapter adapter) {

            // Setting adapter for the listview
            mListView.setAdapter(adapter);
            jsonLength = adapter.getCount();
            for(int i=0;i<adapter.getCount();i++){
                HashMap<String, Object> hm = (HashMap<String, Object>) adapter.getItem(i);
                String imgUrl = (String) hm.get("photoUrl");
                //Log.i(TAG, imgUrl);
                ImageLoaderTask imageLoaderTask = new ImageLoaderTask();

                HashMap<String, Object> hmDownload = new HashMap<String, Object>();
                hm.put("photoUrl",imgUrl);
                hm.put("position", i);

                // Starting ImageLoaderTask to download and populate image in the listview 
                imageLoaderTask.execute(hm);

            }

        }       
    }

    /** AsyncTask to download and load an image in ListView */
    private class ImageLoaderTask extends AsyncTask<HashMap<String, Object>, Void, HashMap<String, Object>>{

        //Adding preExecute
        @Override
        protected void onPreExecute(){
        waitingDialog = ProgressDialog.show(ListViewCategory.this, “Wait..”, "Downloading”);                    waitingDialog.setCancelable(true);
        waitingDialog.show();
        }

        @Override
        protected HashMap<String, Object> doInBackground(HashMap<String, Object>... hm) {
            InputStream iStream=null;
            String imgUrl = (String) hm[0].get("photoUrl");
            int position = (Integer) hm[0].get("position");

            URL url;
            try {
                url = new URL(imgUrl);

                // Creating an http connection to communicate with url
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                // Connecting to url                
                urlConnection.connect();

                // Reading data from url 
                iStream = urlConnection.getInputStream();

                // Getting Caching directory 
                File cacheDirectory = getBaseContext().getCacheDir();

                // Temporary file to store the downloaded image 
                File tmpFile = new File(cacheDirectory.getPath() + "/lakari_"+position+".png");             

                // The FileOutputStream to the temporary file
                FileOutputStream fOutStream = new FileOutputStream(tmpFile);

                // Creating a bitmap from the downloaded inputstream
                Bitmap b = BitmapFactory.decodeStream(iStream);             

                // Writing the bitmap to the temporary file as png file
                b.compress(Bitmap.CompressFormat.PNG,100, fOutStream);              

                // Flush the FileOutputStream
                fOutStream.flush();

                //Close the FileOutputStream
                fOutStream.close();             

                // Create a hashmap object to store image path and its position in the listview
                HashMap<String, Object> hmBitmap = new HashMap<String, Object>();

                // Storing the path to the temporary image file
                hmBitmap.put("foto",tmpFile.getPath());

                // Storing the position of the image in the listview
                hmBitmap.put("position",position);              

                // Returning the HashMap object containing the image path and position

                return hmBitmap;                

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



        }

        @Override
        protected void onPostExecute(HashMap<String, Object> result) {


            // Getting the path to the downloaded image
            String path = (String) result.get("foto");          

            // Getting the position of the downloaded image
            int position = (Integer) result.get("position");

            // Getting adapter of the listview
            SimpleAdapter adapter = (SimpleAdapter ) mListView.getAdapter();

            // Getting the hashmap object at the specified position of the listview
            HashMap<String, Object> hm = (HashMap<String, Object>) adapter.getItem(position);   

            // Overwriting the existing path in the adapter 
            hm.put("foto",path);

            //Count number of images downloaded and sent to listview
            control++;
            Log.i(TAG_2, String.valueOf(control));

            // Noticing listview about the dataset changes
            adapter.notifyDataSetChanged(); 

            if (control/jsonLength == 0){
                waitingDialog.dismiss();
                Toast.makeText(ListViewCategory.this, "Toast Appears. Yes...", Toast.LENGTH_SHORT).show();

            }
        }       
     }

}

请帮帮我吗?

2 个答案:

答案 0 :(得分:0)

您将null返回到postExecute

这就是为什么你的if条件在这里变错了

 if(waitingDialog != null && waitingDialog.isShowing())
            {
                waitingDialog.dismiss();
            }

删除`doInBackground();

中的返回null
}catch (Exception e) {              
                    e.printStackTrace();
                }
         ->       return null;

答案 1 :(得分:0)

我建议您尝试Picasso来处理来自网址的图片加载。 或Volley处理网络连接以及图像加载/缓存。

这是非常简单和更好的选择。

相关问题