我在Android App中有一个Singleton(工作得很好)我需要在另一个线程的类变量中设置数据的一个函数,但是如果我运行该函数两次,数据只会设置。
的onCreate:
Thread thread;
Runnable runnables;
String recvData;
@Override
public void onCreate() {
super.onCreate();
singleInstance = this;
recvData = "one";
Log.v("oncreate", "singleton");
}
threaded_data_set:
public String threaded_set_data() {
runnables = new Runnable(){
@Override
public void run() {
recvData = "two";
return;
}
};
thread = new Thread(runnables);
thread.start()
Log.v("Data", recvData);
return recvData;
}
首次运行时记录("Data", "one")
,仅在第二次记录时更改为("Data", "two")
我在这里做错了什么?
答案 0 :(得分:2)
recvData
的默认值为:
recvData = "one";
这里没有错,
Log.v("Data", recvData);
在您的主题打印出第二条日志消息之前打印出来。
答案 1 :(得分:1)
您假设线程在您到达日志记录语句后立即完成。
尝试在设置时记录线程中的值,您将看到代码在第一次记录调用后发生。
它正常工作,但你希望线程在你的方法继续运行之前完成:)
答案 2 :(得分:0)
这里没有太大问题,您只是没有使用recvData
public String threaded_set_data()
{
runnables = new Runnable(){
@Override
public void run() {
recvData = "two";
Log.v("Data", recvData);
//return; <-- not really needed
}
};
thread = new Thread(runnables);
thread.start()
Log.v("Data", recvData);
return recvData;
}
答案 3 :(得分:0)
在线程的第一次运行时,后者在它自己的线程中运行,这意味着你已经在runnable完成运行之前返回了recvData,因为它并行运行。你想要做的是改用AsyncTask。
答案 4 :(得分:0)
您似乎错过了线程如何工作的细微差别。我认为你假设你的线程在你的日志语句之前运行并返回,但你无法安全地假设。
相反,请尝试使用像您的问题中的评论一样的处理程序。 handler的设计完全适用于此类事物。 Vogella(一个很棒的资源顺便说一句)在e xplaining it so I will direct you there.
方面做得更好