我有一个类调用来自另一个使用线程的类的方法,因为它有点是一个密集的任务。 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本身并不能解释错误所在。
答案 0 :(得分:2)
在这种情况下,您需要使用callback
或interface
或asynctask
。因为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;