0

好的,我先简化一下场景

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

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

接口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 中所述

请指导我哪里错了?

提前致谢

4

1 回答 1

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
}

其次,强烈建议使用Runnable接口而不是扩展Thread类,除非你真的有充分的理由

此外,如果您期望从线程、使用Callable和类Future提供的对象返回一些值ExecutorService更多细节在这里。

于 2013-09-20T07:22:11.417 回答