Java 线程回调未调用。为什么?

Java 线程回调未调用。为什么?,java,android,multithreading,interface,Java,Android,Multithreading,Interface,好的,让我先简化一下场景 实际上,我想在完成后台线程操作后触发一些操作 因此,我制作了一个线程回调接口,如下所示 接口OnThreadCompleted.java 下面是我实际扩展线程的XMLParserThread.java public class XMLParserThread extends Thread { ArrayList<Integer> listWeatherCode; ArrayList<String> listWeatherDesc; ArrayL

好的,让我先简化一下场景

实际上,我想在完成后台线程操作后触发一些操作

因此,我制作了一个线程回调接口,如下所示

接口OnThreadCompleted.java

下面是我实际扩展线程的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();
}
}
实验: 我已经检查了标签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
}