当前位置: 代码迷 >> Android >> 如何解决“线程内不能更新UI”的有关问题
  详细解决方案

如何解决“线程内不能更新UI”的有关问题

热度:77   发布时间:2016-04-28 04:34:29.0
怎么解决“线程内不能更新UI”的问题?
最近做一个音乐播放器,但是在更新列表这步就已经出问题了。
项目设想:用tomcat做服务器,把歌曲放在服务器上,有个xml文件来封装歌曲信息。(暂时没弄数据库)
遇到的问题:android4.0后,如果要用Http的话就需要另开线程,于是我另外开了个线程来通过Http下载xml文件,解析xml文件也是在这个线程内执行。一切还算正常,到了更新列表(添加list)就没有效果出现了,试过用runOnUIThread(其实我也不知道有没有用错,但是没有报错)都不行。。我还是把代码贴出来吧。。有点长。。。。
这是用来更新列表的Activity代码:
package notfamous.mymp3player;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.SAXParserFactory;

import notfamous.download.HttpDownloader;
import notfamous.model.Mp3;
import notfamous.parser.MyContentHandler;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import android.R.menu;
import android.app.ListActivity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.SimpleAdapter;

public class MyMp3ListActivity extends ListActivity {
private static final int UPDATE = 1;
private static final int ABOUT = 2;
private static List<Mp3> mp3s;
private static String xml;
Handler h = null;
Runnable r = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_mp3_list);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.my_mp3_list, menu);
menu.add(0, UPDATE, 1, R.string.mp3list_update);
menu.add(0, ABOUT, 2, R.string.mp3list_about);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
System.out.println("itemId------>"+item.getItemId());
String result = null;

if (item.getItemId() == UPDATE) {
h = new Handler();

r = new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
xml = downloadXML("http://192.168.235.35:8080/mp3/resources.xml");
final List<Mp3> mp3s = parse(xml);
/*final List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
for (Iterator iterator = mp3s.iterator(); iterator
.hasNext();) {
Mp3 mp3 = (Mp3) iterator.next();
HashMap<String, String> map = new HashMap<String, String>();
map.put("mp3_name", mp3.getMp3Name());
map.put("mp3_size", mp3.getMp3Size());
list.add(map);
}*/
/*SimpleAdapter simpleadapter = new SimpleAdapter(
MyMp3ListActivity.this, list,
R.layout.mp3_item, new String[] {
"mp3_name", "mp3_size" },
new int[] { R.id.mp3_name, R.id.mp3_size });
setListAdapter(simpleadapter);*/

runOnUiThread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
final List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
for (Iterator iterator = mp3s.iterator(); iterator
.hasNext();) {
Mp3 mp3 = (Mp3) iterator.next();
HashMap<String, String> map = new HashMap<String, String>();
map.put("mp3_name", mp3.getMp3Name());
map.put("mp3_size", mp3.getMp3Size());
list.add(map);
}
SimpleAdapter simpleadapter = new SimpleAdapter(
MyMp3ListActivity.this, list,
R.layout.mp3_item, new String[] {
"mp3_name", "mp3_size" },
new int[] { R.id.mp3_name, R.id.mp3_size });
setListAdapter(simpleadapter);
}
});
}
};
new Thread(r).start();
h.post(r);
}

return super.onOptionsItemSelected(item);
}

private String downloadXML(String urlStr) {
String result;
HttpDownloader hd = new HttpDownloader();
result = hd.download(urlStr);
return result;
}

private List<Mp3> parse(String xmlStr) {
SAXParserFactory factory = SAXParserFactory.newInstance();
List<Mp3> mp3s = new ArrayList<Mp3>();
try {
XMLReader reader = factory.newSAXParser().getXMLReader();
MyContentHandler contentHandler = new MyContentHandler(
new ArrayList<Mp3>(mp3s));
  相关解决方案