Android 从后台线程更新用户界面
我需要在五月异步任务中从onPostExecute方法更新UI。我尝试的是解析xml并从中提取文本。。我需要从onPostExecute为包含文本的每个xml节点动态创建textView,并将其添加到我的布局中 当我尝试执行此操作时,会出现Get-NetworkOnMainThread异常 我试图解决这个问题,但没有正常工作 请检查我的密码Android 从后台线程更新用户界面,android,android-asynctask,Android,Android Asynctask,我需要在五月异步任务中从onPostExecute方法更新UI。我尝试的是解析xml并从中提取文本。。我需要从onPostExecute为包含文本的每个xml节点动态创建textView,并将其添加到我的布局中 当我尝试执行此操作时,会出现Get-NetworkOnMainThread异常 我试图解决这个问题,但没有正常工作 请检查我的密码 protected void onPostExecute(final InputStream stream) { // dismiss the di
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;
}
}
};
仍然会出现相同的错误。您需要数据信息和setter的对象模型,可以使用以下方法:
private ProgressDialog progressBar;
class MyTask extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar = new ProgressDialog(getApplicationContext());
progressBar.setMessage("please, waiting ...");
progressBar.setCancelable(false);
progressBar.show();
}
@Override
protected String doInBackground(String... params) {
try {
// parsing xml and get data
// get info and set them in my model ...
} catch (Exception e) {
e.printStackTrace();
}
return params[0];
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (null != progressBar && progressBar.isShowing()) {
progressBar.dismiss();
}
// do work in UI and set getter informations and set layout ...
switch(select) {
case 1:
layout.addView(text);
break;
case 2:
layout.addView(text);
break;
}
}
}
您未能发布整个任务,这迫使每个人都必须猜测 我猜您在doInBackground中进行了HTTP连接,然后将结果InputStream传递给onPostExecute。这将不起作用,因为InputStream绑定到网络套接字
将InputStream和XML解析移到doInBackground中。当它抛出NetworkOnMainThreadException时,意味着在单独的线程中完成工作。因此,创建新线程并使用它完成工作。当您尝试执行一些可能需要很长时间的任务(例如从web获取一些数据)时,会引发此异常。您好,谢谢您的回复。是的,就是这样完成的。我认为这就是问题所在,但不知道如何实施。我可以在我的doInBackground中解析xml,但不知道每次节点解析完成后如何更新我的ui。。也就是说,当我们得到第一个内容及其类型和属性时,我需要根据它更新ui。。这一部分让我感到困惑。@VivekPPillai:不知道每次节点解析完成后如何更新我的ui-将doInBackground生成的临时结果存储在您自己设计的对象中。从doInBackground返回该对象,然后将该对象作为参数提供给onPostExecute。根据parse results对象中的数据更新onPostExecute中的UI。嗨,我已将xml解析部分移动到doInBackground方法。。当我们到达并获得一个文本节点及其属性时,每个节点都在解析,我实际需要的是,我需要在iu中创建一个包含文本节点内容的动态textview。。当图像节点出现时,我需要将imageview添加到ui中,以此类推。xml的格式不是静态的,每次都会有所不同,图像和文本节点的顺序有时会有所不同。我需要一个解决方案。。请帮帮我。我们如何用object来解决这个问题,你能给我一些代码吗。。我不熟悉模型教室。。你能给我一些密码吗。。我是说getter和setter课程。。我可以在我的doInBackground中解析xml,但不知道每次节点解析完成后如何更新我的ui。。也就是说,当我们得到第一个内容及其类型和属性时,我需要根据它更新ui。。那部分让我很困惑。。