AsyncTask的设置不正确-Android

AsyncTask的设置不正确-Android,android,android-asynctask,Android,Android Asynctask,我一整天都在试图整理这个类文件,但我遇到了更多的问题。我相信这个类文件的设置是完全错误的。我认为AsyncTask不正确,我的onCreateView也不正确。我试图做的是从internet下载一个XML文件,并将信息放入ListView要使用的区域。我已经让它工作了,但我决定将其更改为片段使用,也就是说,当出现问题时,显然不能将相同的内容用于活动作为片段。这是我的类文件,因为我不明白在异步任务方面哪里出了问题,特别是我能得到一些帮助。谢谢你帮助我 错误:AsyncTask上的解析器无法解析符号

我一整天都在试图整理这个类文件,但我遇到了更多的问题。我相信这个类文件的设置是完全错误的。我认为AsyncTask不正确,我的onCreateView也不正确。我试图做的是从internet下载一个XML文件,并将信息放入ListView要使用的区域。我已经让它工作了,但我决定将其更改为片段使用,也就是说,当出现问题时,显然不能将相同的内容用于活动作为片段。这是我的类文件,因为我不明白在异步任务方面哪里出了问题,特别是我能得到一些帮助。谢谢你帮助我

错误:AsyncTask上的解析器无法解析符号,并且xml字符串与我想要使用它的目的不正确。我现在真的迷路了

CustomizedListView.class

public class CustomizedListView extends Fragment {
// All static variables
static final String URL = "http://api.androidhive.info/music/music.xml";
// XML node keys
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";

ListView list;
LazyAdapter adapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    final View v = inflater.inflate(R.layout.list_row, container, false);
    list = (ListView) v.findViewById(R.id.game_list);
    return v;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
    new TheTask().execute();
    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);
    }




    // Getting adapter by passing xml data ArrayList
    adapter=new LazyAdapter(getActivity(), songsList);
    list.setAdapter(adapter);


    // Click event for single list row
    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {


        }
    });
}
}
class TheTask extends AsyncTask<Void,Void,Void> {
static final String URL = "http://api.androidhive.info/music/music.xml";
static final String xml = xml;


@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
}

@Override
protected void onPostExecute(Void result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
}

@Override
protected Void doInBackground(Void... params) {
    // TODO Auto-generated method stub
    String xml = parser.getXmlFromUrl(URL);
    return null;
}

你完全错了。。我建议你去读一读关于
多线程编程
异步任务
的书,这对你解决这个问题有很大帮助

代码中有很多问题,我修复了很多问题,但我会提到最重要的问题和我真正记得的问题:p

  • 如果要使用全局定义的变量,则应在
    活动
    类中定义
    异步任务
    类。。在你的案例中,是在外部定义的
  • 执行
    AsyncTask
    时,它会创建一个新线程,并且新后台线程中的命令独立于
    UI
    线程中的命令运行。我的观点是,许多人认为
    UI
    线程将停止,以便
    后台
    线程完成工作。这是错误的,也是程序员的一个常见问题
  • 你真的很讨厌缩进。你不觉得吗?当读到一段缩进错误的代码时,它会让其他程序员发疯,这会导致你的问题仍然没有答案
  • 以下是固定代码:

    public class CustomizedListView extends Fragment {
        // All static variables
        static final String URL = "http://api.androidhive.info/music/music.xml";
        // XML node keys
        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";
    
    
        ListView list;
        ArrayList<HashMap<String, String>> songsList;
        View view;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
            final View v = inflater.inflate(R.layout.list_row, container, false);
            list = (ListView) v.findViewById(R.id.game_list);
            view = v;
            return v;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            new TheTask().execute();
    
            // Click event for single list row
            list.setOnItemClickListener(new OnItemClickListener() {
    
    
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                        long arg3) {
                    // TODO Auto-generated method stub
    
                }
            });
        }
    
        class TheTask extends AsyncTask<Void, Void, Void> {
    
            static final String URL = "http://api.androidhive.info/music/music.xml";
    
            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();
            }
    
            @Override
            protected Void doInBackground(Void... params) {
                XMLParser parser = new XMLParser();
                String xml = parser.getXmlFromUrl(URL); // getting XML from URL
                songsList = new ArrayList<HashMap<String, String>>();
                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(Void result) {
                // Getting adapter by passing xml data ArrayList
                LazyAdapter adapter = new LazyAdapter(getActivity(), songsList);
                ((ListView) view.findViewById(R.id.game_list)).setAdapter(adapter);
                super.onPostExecute(result);
            }
        }
    }
    
    public类CustomizedListView扩展片段{
    //所有静态变量
    静态最终字符串URL=”http://api.androidhive.info/music/music.xml";
    //XML节点密钥
    静态最终字符串键\u SONG=“SONG”//父节点
    静态最终字符串键\u ID=“ID”;
    静态最终字符串键\u TITLE=“TITLE”;
    静态最终字符串键\u ARTIST=“ARTIST”;
    静态最终字符串键\u DURATION=“DURATION”;
    静态最终字符串键\u THUMB\u URL=“THUMB\u URL”;
    列表视图列表;
    ArrayList songsList;
    视图;
    @凌驾
    CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
    最终视图v=充气机充气(右布局列表,容器,错误);
    列表=(列表视图)v.findViewById(R.id.game_列表);
    视图=v;
    返回v;
    }
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    新建任务().execute();
    //单击单个列表行的事件
    list.setOnItemClickListener(新的OnItemClickListener(){
    @凌驾
    公共链接(AdapterView arg0、视图arg1、内部arg2、,
    长arg3){
    //TODO自动生成的方法存根
    }
    });
    }
    类任务扩展异步任务{
    静态最终字符串URL=”http://api.androidhive.info/music/music.xml";
    @凌驾
    受保护的void onPreExecute(){
    //TODO自动生成的方法存根
    super.onPreExecute();
    }
    @凌驾
    受保护的Void doInBackground(Void…参数){
    XMLParser=新的XMLParser();
    字符串xml=parser.getXmlFromUrl(URL);//从URL获取xml
    songsList=newarraylist();
    Document doc=parser.getDomeElement(xml);//获取DOM元素
    NodeList nl=doc.getElementsByTagName(KEY_-SONG);
    //循环通过所有歌曲节点
    对于(int i=0;ivalue
    put(KEY_ID,parser.getValue(e,KEY_ID));
    put(KEY_TITLE,parser.getValue(e,KEY_TITLE));
    put(KEY_-ARTIST,parser.getValue(e,KEY_-ARTIST));
    put(KEY_DURATION,parser.getValue(e,KEY_DURATION));
    put(KEY_THUMB_URL,parser.getValue(e,KEY_THUMB_URL));
    //将哈希列表添加到ArrayList
    歌曲列表。添加(地图);
    }
    返回null;
    }
    @凌驾
    受保护的void onPostExecute(void结果){
    //通过传递xml数据ArrayList获取适配器
    LazyAdapter=新的LazyAdapter(getActivity(),songsList);
    ((ListView)view.findviewbyd(R.id.game_list)).setAdapter(adapter);
    super.onPostExecute(结果);
    }
    }
    }
    
    OnCreate
    使用了
    list
    ,但该列表视图稍后在
    onCreateView
    中实例化,我知道我的代码将有很多问题,并且缺乏优化,因为我只是在测试,但我需要让它正常工作。关于第三点,缺少正确的缩进是由于从我的IDE复制和粘贴造成的。当我使用你的代码启动应用程序时,我得到一个强制关闭。你能看一下我在帖子底部发布的日志吗,看看问题在哪里,因为我看不到其中的具体问题。无论哪种方式,我都非常感谢您这么做,因为我一整天都有很多麻烦。第52行是list.setOnItemClickListener(new OnItemClickListener(){这是因为
    onCreate
    方法是在
    onCreateView
    方法之前调用的。这会导致
    NullPoin
    
    public class CustomizedListView extends Fragment {
        // All static variables
        static final String URL = "http://api.androidhive.info/music/music.xml";
        // XML node keys
        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";
    
    
        ListView list;
        ArrayList<HashMap<String, String>> songsList;
        View view;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
            final View v = inflater.inflate(R.layout.list_row, container, false);
            list = (ListView) v.findViewById(R.id.game_list);
            view = v;
            return v;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            new TheTask().execute();
    
            // Click event for single list row
            list.setOnItemClickListener(new OnItemClickListener() {
    
    
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                        long arg3) {
                    // TODO Auto-generated method stub
    
                }
            });
        }
    
        class TheTask extends AsyncTask<Void, Void, Void> {
    
            static final String URL = "http://api.androidhive.info/music/music.xml";
    
            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();
            }
    
            @Override
            protected Void doInBackground(Void... params) {
                XMLParser parser = new XMLParser();
                String xml = parser.getXmlFromUrl(URL); // getting XML from URL
                songsList = new ArrayList<HashMap<String, String>>();
                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(Void result) {
                // Getting adapter by passing xml data ArrayList
                LazyAdapter adapter = new LazyAdapter(getActivity(), songsList);
                ((ListView) view.findViewById(R.id.game_list)).setAdapter(adapter);
                super.onPostExecute(result);
            }
        }
    }