非同期タスクの onPostExecute メソッドから UI を更新する必要があります。私がしようとしているのは、xmlを解析してそこからテキストを取得することです.テキストを含むxmlノードごとにonPostExecute()からtextViewを動的に作成し、レイアウトに追加する必要があります..
これを実行しようとすると、NetworkOnMainThreadException が発生しました。
この問題を解決するためにハンドラを試しましたが、正しく動作しませんでした。
私のコードを確認してください。
protected void onPostExecute(final InputStream stream) {
// dismiss the dialog after getting all albums
pDialog.dismiss();
try {
XmlPullParser xpp = Xml.newPullParser();
xpp.setInput(stream, null);
xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
xpp.next();
int eventType = xpp.getEventType();
System.out.println("eventType : " + eventType);
String tagname = null;
String type = null;
String link = null;
String content = null;
while (eventType != XmlPullParser.END_DOCUMENT)
{
if(eventType == XmlPullParser.START_DOCUMENT){
// str += "\nXML Parsing Starting...\n";
eventType = xpp.next();
continue;
}
else if(eventType == XmlPullParser.START_TAG)
{
// str += "\nroot tag: "+xpp.getName();
tagname = xpp.getName();
if(xpp.getName().equals("text")){
if(xpp.getAttributeCount()>0){
type = xpp.getAttributeValue(null, "type");
// str += "\nroot attr: "+type;
}
}
else if((xpp.getName().equals("image")) || (xpp.getName().equals("audio")) || (xpp.getName().equals("video")) ){
if(xpp.getAttributeCount()>0){
link = xpp.getAttributeValue(null, "src");
// str += "\nroot attr: "+link;
}
}
}
else if(eventType == XmlPullParser.TEXT)
{
content = xpp.getText();
// str += "\nvalue : "+xpp.getText();
}
else if(eventType == XmlPullParser.END_TAG)
{
// str += "\nending tag: "+xpp.getName();
eventType = xpp.next();
continue;
}
System.out.println("content : " + content);
System.out.println("tagname : " + tagname);
if(content != null ){
if((tagname.equals("text") || tagname.equals("preview")) ){
// UPDATE_TEXT =1;
// TextView text = new TextView(ContentView.this);
text = new TextView(getBaseContext());
text.setText(content);
if(type != null){
if(type.equals("heading1"))
text.setTextAppearance(ContentView.this, R.style.heading1);
else if(type.equals("heading2"))
text.setTextAppearance(ContentView.this, R.style.heading2);
else if(type.equals("heading3"))
text.setTextAppearance(ContentView.this, R.style.heading3);
else if(type.equals("heading4"))
text.setTextAppearance(ContentView.this, R.style.heading4);
type = null;
}
if (text != null && layout != null){
Log.e(getPackageName(), text.toString());
runOnUiThread(new Runnable() {
public void run() {
Message message = handler.obtainMessage();
message.what = 1;
handler.sendMessage(message);
// handler.sendEmptyMessage(1);
// layout.addView(text);
}
});
}
content = null;
}
else if((tagname.equals("image"))){
text = new TextView(ContentView.this);
text.setText(content);
if(link != null){
link = null;
}
runOnUiThread(new Runnable() {
public void run() {
handler.sendEmptyMessage(1);
// layout.addView(text);
}
});
content = null;
}
}
eventType = xpp.next();
}
// str += "\n\nXML parsing Ending......";
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
アクティビティ クラスのハンドラ クラスを確認してください。
protected Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
layout.addView(text);
break;
case 2:
layout.addView(text);
break;
}
}
};
それでも同じエラーが発生します。