Android Бесконечный цикл Прогресс Диалог AsyncTask

1

Я получаю бесконечную загрузку, и мой gridview не отображается. Мой веб-адрес xml работает, и все кажется прекрасным. Что-то не так с моими кодами? Я только что изменил некоторые коды, я пытался изучить Asynctask здесь. пожалуйста, помогите мне

CustomizedListView.class

    public class CustomizedListView extends Activity {
        // All static variables
        private ProgressDialog pDialog;
        static final String URL = "http://XXXXXX";
        // XML node keys
        ArrayList<HashMap<String, String>> songsList;
        static final String KEY_SONG = "song"; // parent node
        static final String KEY_ID = "id";
        static final String KEY_TITLE = "title";
        static final String KEY_ARTIST = "artist";
        static final String KEY_DURATION = "duration";
        static final String KEY_THUMB_URL = "thumb_url";
        static String IMAGE_POSITION;
        GridView grid;
        LazyAdapter adapter;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.grid_layout);
            //StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

            //StrictMode.setThreadPolicy(policy); 

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

             new loadGridView().execute();


            grid = (GridView) findViewById(R.id.grid_view);
            grid.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    String title = ((TextView) view.findViewById(R.id.title)).getText().toString();
                    String artist = ((TextView) view.findViewById(R.id.artist)).getText().toString();
                    String url = ((TextView) view.findViewById(R.id.duration)).getText().toString();
                    // Starting new intent
                    Intent in = new Intent(getApplicationContext(),SingleMenuItemActivity.class);
                    in.getIntExtra(IMAGE_POSITION, position);
                    in.putExtra(KEY_TITLE, title);
                    in.putExtra(KEY_ARTIST, artist);
                    in.putExtra(KEY_THUMB_URL,url);
                    startActivity(in);      

                }
            });
        }

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

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                pDialog = new ProgressDialog(
                        CustomizedListView.this);
                pDialog.setMessage("Loading websites ...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(false);
                pDialog.show();
            }

            @Override
            protected String doInBackground(String... args) {
                // updating UI from Background Thread


                        XMLParser parser = new XMLParser();
                        String xml = parser.getXmlFromUrl(URL); // getting XML from URL
                        Document doc = parser.getDomElement(xml); // getting DOM element

                        NodeList nl = doc.getElementsByTagName(KEY_SONG);
                        // looping through all song nodes <song>
                        for (int i = 0; i < nl.getLength(); i++) {
                            // creating new HashMap
                            HashMap<String, String> map = new HashMap<String, String>();
                            Element e = (Element) nl.item(i);
                            // adding each child node to HashMap key => value
                            map.put(KEY_ID, parser.getValue(e, KEY_ID));
                            map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
                            map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST));
                            map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION));
                            map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));

                            // adding HashList to ArrayList
                            songsList.add(map);
                        }


                        return null;

                    }   
@Override
                    protected void onPostExecute(String args) {
                // dismiss the dialog after getting all products
                adapter=new LazyAdapter(CustomizedListView.this, songsList);        
                grid.setAdapter(adapter);
                pDialog.dismiss();
            }


            }

        }
Теги:
android-asynctask
gridview

2 ответа

1
Лучший ответ

Вы должны использовать

adapter = new LazyAdapter (имя_файла.this, songList);

Вы совсем не используете функциональность doInbackground. Поскольку вы снова вызываете runOnuithread. Убери это.

Переместить связанный с адаптером вызов в поток Ui можно в OnpostExecute

  • 0
    только что сделал это, и я все еще получил это android.os.NetworkOnMainThreadException. Я не хочу использовать StrictMode.setThreadPolicy (policy);
  • 0
    Проверьте редактирование.
Показать ещё 8 комментариев
0

Использовать контекст

public LazyAdapter(Context context, ArrayList<HashMap<String, String>> d) {
        context = context;
        data=d;
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader=new ImageLoader(context.getApplicationContext());
    }

и поместите ссылку на контекст на ваш конструктор AsyncTask. Я полагаю, что лучше всего заполнить ваш адаптер в методе

 void onPostExecute(String args) {
// fill your adapter here
        }

вместо doInBackground();

  • 0
    Yahor10, вы можете помочь мне с этим. Мой диалог прогресса никогда не останавливается, и мой gridview не отображается.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню