从另一个使用线程

时间:2016-06-13 06:45:45

标签: java android multithreading

我有一个类调用来自另一个使用线程的类的方法,因为它有点是一个密集的任务。 Thread负责查找字典以查找匹配的单词。当找到一个单词时,它应该/确实在该类中设置一个局部变量。我可以看到它成功设置了这个String,因为它在日志中说了这么多。但是,每当我尝试从另一个类中检索此String并将TextView设置为此String的值时,就不会发生任何事情。

我使用Thread因为跳过很多帧。但是,当我不使用该线程时,它可以正常工作(减去正在跳过的帧)。

这是使用线程的方法:

public String checkLetters() {
    new Thread(new Runnable() {
        @Override
        public void run() {
    //Finding the directory on SD Card
    File sdcard = Environment.getExternalStorageDirectory();

    //Retrieve the text file
    File file = new File(sdcard,"NewEnglishDictionary.txt");

   try {
        BufferedReader bufferRead = new BufferedReader(new FileReader(file),24396);
        String line; //= "";

        //While no word found keep looping
        while (wholeWordFound == false ) {
            line = bufferRead.readLine();
            Log.d("ResolveWord", "Current Line: " + line);

            wordReturned = workOutWord(line);
            setWord(wordReturned);
        }

       String value = getWord().toString().toLowerCase();

       Log.d("Value of setWord: ", " equals: "+ value);
        bufferRead.close();


    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
        }
    }).start();
    return wordReturned;
}

并调用以检索已设置的变量(根据日志)

tv_WordFound.setText(fixAnagram.getWord());

假设将其返回的方法:

public String getWord() {

    Log.d("Test", "getWord: " + wordReturned);
    return wordReturned;

}

线程中是否有我缺少的东西?

为任何帮助干杯。 Logcat本身并不能解释错误所在。

2 个答案:

答案 0 :(得分:2)

在这种情况下,您需要使用callbackinterfaceasynctask。因为Thread内部checkLetters方法将在checkLetters之后结束。这意味着如果您在致电getWord()后立即致电checkLetters,则只能获得之前的检查结果。

答案 1 :(得分:0)

Java的内存模型不保证,一个线程设置的值会被另一个线程立即看到。 为了保证这一点,你必须将变量声明为" volatile"或者有一个同步参与(例如,使用关键字synchronized的getter和setter方法)。

e.g。

arryData = [[NSMutableArray alloc] initWithObjects:@"@&", textFieldinput.text, nil];

private volatile String word;