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 に記載されているログが Thread の状態を として返していることを確認しましたWAITING。また、スレッドがすべての操作を実行していることも確認しました。

問題

アクティビティでコールバック メソッドを呼び出していないため、ラベル 2 で述べたように、アクティビティのログは何も返しません。

どこが間違っているのか教えてください。

前もって感謝します

4

1 に答える 1

1

listener問題の 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
}

第二に、本当に強い理由がない限り、クラスを拡張する代わりにインターフェイスを使用することを強くお勧めしますRunnableThread

また、スレッドから何らかの値が返されることを期待している場合は、クラスによって提供されるCallableおよびFutureオブジェクトを使用します。詳細はこちら。ExecutorService

于 2013-09-20T07:22:11.417 に答える