【问题标题】:Thread callback is not calling. why?线程回调未调用。为什么?
【发布时间】:2013-09-20 07:18:24
【问题描述】:

好的,我先简化一下场景

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

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

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

请指导我哪里错了?

提前致谢

【问题讨论】:

  • 只是一个旁注:你知道AsyncTask,对吗?
  • 是的,我知道,现在不需要讨论。

标签: java android multithreading interface


【解决方案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 类,除非你真的有充分的理由

此外,如果您希望从线程返回一些值,请使用 ExecutorService 类提供的 CallableFuture 对象。 More details here.

【讨论】:

  • 天啊,我的代码没有错,只有一行 :) 感谢您的描述,我如何在可运行接口中使用此代码以及使用可运行接口的主要原因是什么?扩展线程类。
  • 现在回调方法正在完美调用,但是日志总是将线程状态返回为 RUNNABLE。它什么时候会把完成的或完成的等归还给我?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多