Java 线程回调未调用。为什么?
好的,让我先简化一下场景 实际上,我想在完成后台线程操作后触发一些操作 因此,我制作了一个线程回调接口,如下所示 接口OnThreadCompleted.java 下面是我实际扩展线程的XMLParserThread.javaJava 线程回调未调用。为什么?,java,android,multithreading,interface,Java,Android,Multithreading,Interface,好的,让我先简化一下场景 实际上,我想在完成后台线程操作后触发一些操作 因此,我制作了一个线程回调接口,如下所示 接口OnThreadCompleted.java 下面是我实际扩展线程的XMLParserThread.java public class XMLParserThread extends Thread { ArrayList<Integer> listWeatherCode; ArrayList<String> listWeatherDesc; ArrayL
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();
}
}
实验:
我已经检查了标签1中提到的日志是否返回线程状态为等待
。我还检查了我的线程是否也在执行其所有操作
问题
它不会在我的活动中调用回调方法,因此我的活动中的日志不会返回任何内容,如标签2中所述
请告诉我哪里错了
提前感谢一个问题是,即使您将
侦听器
作为参数为线程,您也没有从线程调用侦听器的回调方法
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
}
其次,除非您有充分的理由,否则最好使用Runnable
接口而不是扩展Thread
类
另外,如果您希望从线程返回一些值,请使用
ExecutorService
类提供的Callable
和Future
对象 只是旁注:你知道,是吗?是的,我知道,现在不需要讨论。天哪,我的代码没有错,只有一行:)也谢谢你的描述,如何在runnable接口中使用此代码,以及使用runnable接口而不扩展thread类的主要原因是什么。现在回调方法正在完美地调用,但是日志总是将thread的状态返回给我作为runnable。何时会将已完成的或已完成的等返回给我?
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**
}
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
}