线程回调没有调用。为什么?

时间:2013-09-20 07:18:25

标签: java android multithreading interface

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

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

因此我创建了一个线程回调接口,如下所示。

界面 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中所述

请指导我哪里错了?

提前致谢

1 个答案:

答案 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类提供的FutureExecutorService个对象。 More details here.