我在Android java项目中有一个主类,其中定义了所有函数。然后我有另外两个扩展主类的类并实现Runnable
。
X
。Y
。在主类中,我启动2个线程:一个用于Class2,一个用于Class3。
当我尝试从主要类别中调用Class2.X
时,无论如何都始终为null
。我尝试了volatile
,synchronized(thread)
,getvalue()
等,但它无效。
我应该怎么做才能读取Class2.X
的值,使其在主类中不为空?
以下是代码:
Thread t = new Thread(new Functionss(mRgbImage));
t.start();
Thread t2 = new Thread(new Functionss_2(mRgbImage));
t2.start();
if(boolean_variable)
{
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Bitmap final_added =addition(mRgbImage2, mRgbImage3);
mImageView.setImageBitmap(final_added);
mRgbImage2
和mRgbImage3
是static volatile
变量。
事实上,我认为这不是变量的问题,因为当我在主类中使用图像并修改它,然后执行mImageView.setImageBitmap(initial_image)
时,我的Android手机上仍然会出现黑屏。
我在logcat中注意到以下内容:
Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@40a34d28
如果删除线程,我不会收到此错误。
任何帮助?
答案 0 :(得分:1)
我怀疑你的线程永远不会执行赋值语句或者分配不同的值或其他东西。也许放一些日志消息或调试你的应用程序并在分配上设置一个断点会有所帮助。
如果你有类似的话:
public class MainClass {
Class2 class2 = new Thread(new Class2());
class2.start();
class2.join();
// Class2.value will == 10 here
}
然后:
public class Class2 implements Runnable {
public static volatile int value;
public void run() {
...
this.value = 10;
...
}
}
然后,在Class2
中进行分配后,value
将更新。这显然是一个简单的示例,我怀疑Class2
线程实际上没有在您的代码中完成,但只要已达到分配,那么value
将被更改。同样,日志消息或调试器在这里会有所帮助。
最好有类似下列模式的东西:
public class Class2 implements Runnable {
private volatile int value;
public void run() {
...
this.value = 10;
...
}
public int getValue() {
return this.value;
}
}
然后,MainClass
可以在不混淆的情况下访问Class2
和Class3
中的值。请注意,您仍然需要volatile
关键字,因为该值是从不同的线程获取/设置的。
希望这里有所帮助。如果您使用更多详细信息编辑问题,我可以提供更多帮助。
答案 1 :(得分:0)
我使用的是JJIL库,结果证明
” 哪些步骤会重现这个问题?
由于对传递的Graphics对象的静态引用,将根据首先执行的线程而存在不确定的结果。 “
参考:http://code.google.com/p/jjil/issues/detail?id=27
我怀疑它与库有什么关系,因为我用数学函数重写代码而输出是正确的。它正在等待两个班级完成并使用他们的输出进行进一步的计算。
希望这有助于其他人卡住。