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