好的,让我先简化一下情景
实际上我想在完成后台线程操作后触发一些操作。
因此我创建了一个线程回调接口,如下所示。
界面 OnThreadCompleted.java
package xml.parser;
public interface OnThreadCompleted {
public void OnThreadCompleted();
}
这是我的实际 XMLParserThread.java 扩展主题
public class XMLParserThread extends Thread {
ArrayList<Integer> listWeatherCode;
ArrayList<String> listWeatherDesc;
ArrayList<String> listIcon_day;
ArrayList<String> listIcon_night;
Context context;
String fileName;
XMLParser xmlParser;
OnThreadCompleted listner;
public XMLParserThread(Context context, String fileName,
OnThreadCompleted listner) {
this.context = context;
this.fileName = fileName;
this.listner = listner;
}
@Override
public void run() {
xmlParser = new XMLParser();
listWeatherCode = new ArrayList<Integer>();
listWeatherDesc = new ArrayList<String>();
listIcon_day = new ArrayList<String>();
listIcon_night = new ArrayList<String>();
String xmlResponse = null;
try {
xmlResponse = xmlParser.getXmlFromFile(context, fileName);
Document doc = xmlParser.getDomElement(xmlResponse);
NodeList nList = doc.getElementsByTagName("condition");
for (int i = 0; i < nList.getLength(); i++) {
Element element = (Element) nList.item(i);
listWeatherCode.add(Integer.valueOf(xmlParser.getValue(element,
"code")));
listWeatherDesc.add(xmlParser.getValue(element, "description"));
listIcon_day.add(xmlParser.getValue(element, "day_icon"));
listIcon_night.add(xmlParser.getValue(element, "night_icon"));
}
Log.e("listWeatherCode", listWeatherCode.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.run();
}
}
我在我的活动中调用我的线程,如
private void callXMLParserThread() {
String fileName = "weather_conditions.xml";
parserThread = new XMLParserThread(context, fileName,
new OnThreadCompleted() {
@Override
public void OnThreadCompleted() {
Log.e("parserThread State", parserThread.getState()
+ ""); // **Label 2**
}
});
parserThread.start();
Log.e("parserThread State", parserThread.getState()
+ ""); // **Label 1**
}
的实验: 的
我检查了标签1中提到的日志,将线程的状态作为WAITING
返回给我。我也检查过我的线程也在执行其所有操作,
的问题 的
它没有在我的活动中调用我的回调方法,因此登录我的活动没有返回任何内容,如标签2中所述
请指导我哪里错了?
提前致谢
答案 0 :(得分:1)
一个问题是,即使你已经将listener
作为参数是线程,你没有从线程调用侦听器的回调方法
OnThreadCompleted listner;
public XMLParserThread(Context context, String fileName,
OnThreadCompleted listner) {
this.context = context;
this.fileName = fileName;
this.listner = listner;
}
@Override
public void run() {
//listener.OnThreadCompleted() call is missing
}
其次,highly recommended使用Runnable
界面而不是扩展Thread
类,除非你真的有很强的理由
此外,如果您期望从线程返回某些值,请使用Callable
类提供的Future
和ExecutorService
个对象。 More details here.