我有一个项目,它将精确定位添加到地图中。对于地图,我们使用手势图像视图使其可滚动,对于按钮,我们使用ImageButton。
但以下问题正在发生:每当我们移动地图时,我们都必须确保精确定位。
问题是,我们从GestureImageView内的另一个线程调用ImageButton的翻译函数,而不允许您调用该视图。
E/AndroidRuntime﹕ FATAL EXCEPTION: GestureImageViewAnimator
Process: nl.example.android, PID: 17024
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6915)
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1089)
at android.view.ViewGroup.invalidateChildFast(ViewGroup.java:4639)
at android.view.View.invalidateViewProperty(View.java:11748)
at android.view.View.setTranslationY(View.java:11102)
at nl.example.android.GestureImageView.setPosition(GestureImageView.java:455)
at nl.example.android.GestureImageViewTouchListener.handleDrag(GestureImageViewTouchListener.java:449)
at nl.example.android.GestureImageViewTouchListener$1.onMove(GestureImageViewTouchListener.java:122)
at nl.example.android.FlingAnimation.update(FlingAnimation.java:49)
at nl.example.android.Animator.run(Animator.java:45)
我现在尝试的是:活动上下文的类
public class MyActivity extends Activity {
private static Activity activity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activity = this;
}
}
GestureImageView:中的代码
final float transX = x;
MyActivity myActivity = new MyActivity();
myActivity.runOnUiThread(new Runnable() {
public void run() {
setTranslationY(transX);
}
});
MainActivity:中的代码
MyActivity myActivity = new MyActivity();
Runnable runnable = new Runnable() {
@Override
public void run() {
pin1.setTranslationY(3);
synchronized(this){
this.notify();
}
}
};
synchronized(runnable) {
myActivity.runOnUiThread(runnable);
runnable.wait() ; // unlocks myRunable while waiting
}
在文件GestureImageView中,第455行尝试:
activity.runOnUiThread(new Runnable(){
public void run(){
setTranslationZ(x);
}
});
不能从其他线程调用视图函数。您必须在main上调用它。如果您想等待结束执行runOnUiThread,请使用以下命令:
Runnable r = new Runnable(){public void run(){
setTranslationZ(...);
synchronized(this){
this.notify();
}
}};
synchronized( myRunnable ) {
activity.runOnUiThread(myRunnable);
myRunnable.wait() ; // unlocks myRunable while waiting
}
为不知道如何使用runOnUiThread:的人编辑
class GestureImageView extends View{
private long thread;
public GestureImageView(Context c){
super(c);
thread=Thread.currentThread().getId();
}
public void setTranslationZ(final int n){
if(thread==Thread.currentThread().getId()){ //this is UI thread
super.setTranslationZ(n);
} else {
MainActivity.instance.runOnUiThread(new Runnable(){
public void run() {
setTranslationZ(n);
}
});
}
}
}
public class MainActivity extends Activity
{
public static Activity instance;
public MainActivity(){
instance=this;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
}