我正在尝试在android中开发一个与音频处理相关的应用程序。我有一个线程(不是UI线程)我在做一个操作。我需要在它仍在进行时更新操作的结果。同样我使用的是Handler。我只是使用Toast在处理程序中显示结果。截至目前,我的线程仍然是第一次单独运行,在显示第一个结果后,线程不再运行,因为结果没有更新。我刚刚知道,在修改此Thread和UI共享的变量时,我需要同步两个线程。我对么?如果是这样我怎么能实现它?
谢谢!
修改
我发布了一个在我的线程和我的处理程序中运行的方法的一部分。
while(fulldatabuffcnt+200<=fulldatabuffer.size())
{
double[] windowdata=new double[200];
classlabel=0;
//classlabel_new=0;
int windowcnt=0;
for (int h=fulldatabuffcnt;h<fulldatabuffcnt+200;h++)
{
windowdata[windowcnt]=fulldatabuffer.get(h);
windowcnt++;
}
MFCCcoeffs=mfcc_inst.getParameters(windowdata);
classlabel=likeli_ref.llhmain(MFCCcoeffs);
try {
out.writeInt(fulldatabuffer.size());
} catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
classlabel_array[ecount]=classlabel;
ecount++;
if (ecount==25)
{
synchronized(SharedData.globalInstance) {
SharedData.globalInstance.classlabel_new =occurence(classlabel_array);//<--shared variable classlabel_new getting modified
}
try {
out_max.writeInt(SharedData.globalInstance.classlabel_new);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
ecount=0;
uiCallback.sendEmptyMessage(0);
}
fulldatabuffcnt=fulldatabuffcnt+80;
}
if(fulldatabuffcnt+200>fulldatabuffer.size()){
AppLog.logString("Setting calclating thread to null");
calculatingThread = null;
}
try {
out.close();
out_max.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
private Handler uiCallback = new Handler () {
public void handleMessage (Message msg) {
int label_handler;
synchronized(SharedData.globalInstance) {
label_handler=SharedData.globalInstance.classlabel_new;
}
Toast.makeText(MFCC2Activity.this, "Classified label" +label_handler, Toast.LENGTH_SHORT).show();//<--trying to access classlabel_new
}
};
答案 0 :(得分:1)
是的,您应该进行同步以确保您的UI线程不会访问仅由您自己的线程部分设置的变量。
我建议你有一个单例对象,它包含你需要在两个线程之间传递的所有变量/数据等。例如,假设您需要在自己的线程和UI线程之间共享字符串和double。使用单例创建一个SharedData类,例如
class SharedData {
public String aString;
public double aDouble;
public static SharedData globalInstance = new SharedData();
}
然后在您自己的线程中设置数据
synchronized(SharedData.globalInstance) {
SharedData.globalInstance.aString = "some string";
SharedData.aDouble = 42.0;
}
并在你的UI线程中
String aString;
double aDouble;
synchronized(SharedData.globalInstance) {
aString = SharedData.globalInstance.aString;
aDouuble = SharedData.aDouble;
}
// do something with aString and aDouble
如果您这样做,那么UI线程读取的部分设置数据就不会有任何问题。