gpt4 book ai didi

android - 在 android 3.x 中拖放少量后会导致 illegalStateException

转载 作者:可可西里 更新时间:2023-11-01 19:08:16 24 4
gpt4 key购买 nike

android 3.x 的拖放机制有问题:进行一些拖动(比如 30 次拖动)后会出现异常(请参阅附加链接)

https://groups.google.com/forum/#!msg/android-platform/2APvO248NNY/rKI-5dCT8XcJ(我登录的内容与该帖子所附的内容相同。)

android 技术人员在那里回答说这是 API 中的错误,并说避免该问题的唯一方法是调用垃圾收集器。

我做到了。异常不再被抛出,但过了一段时间(比如更多 30-40 次拖动)android 出于某种原因停止调用 drop 事件。

我试图通过释放所有资源/ Canvas /绘图缓存/回收位图并重新创建它们来“刷新”所有 View ,但它没有帮助(不再抛出异常 - 但仍然在一些拖放之后事件不起作用)

唯一“有帮助”的是关闭 Activity 并重新启动它。

有人以某种方式解决了这个问题,或者有一个很好的简单替代方案吗??? (除了实现我自己的拖放功能..)

我希望获得不会强制我重新启动或重新创建任何不应...的解决方案。

这里是演示错误的示例代码(不演示我所说的使用 System.GC 后拖放事件问题的部分):

public class DragandDropExampleActivity extends Activity {

private boolean mIsBeenDragged = false;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final ImageView imageViewToDRag = (ImageView) findViewById(R.id.image_view_to_drag);

imageViewToDRag.setClickable(true);

imageViewToDRag.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {
mIsBeenDragged = true;
DragShadowBuilder shadowBuilder = new DragShadowBuilder(imageViewToDRag);
imageViewToDRag.startDrag(null, shadowBuilder, imageViewToDRag, 0);
} else if (event.getAction() == MotionEvent.ACTION_UP) {

mIsBeenDragged = false;
}
return false;
}
});

}
}

这是 xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_frame"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<ImageView
android:id="@+id/image_view_to_drag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" >

</ImageView>

这是堆栈跟踪:

06-04 13:34:32.730: E/View(8061):
java.lang.IllegalArgumentException
at android.view.Surface.lockCanvasNative(Native Method)
at android.view.Surface.lockCanvas(Surface.java:350)
at android.view.View.startDrag(View.java:11489)
at com.show.dragandrop.DragandDropExampleActivity$1.onTouch(DragandDropExampleActivity.java:32)
at android.view.View.dispatchTouchEvent(View.java:4617)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java: 1862)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1286)
at android.app.Activity.dispatchTouchEvent(Activity.java:2315)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1835)
at android.view.View.dispatchPointerEvent(View.java:4689)
at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2415)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2077)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4126)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)

要生成异常 - 只需将图像拖到屏幕上的某个点,然后离开手指。恰好重复 30 次,然后抛出异常。我做了这个非常简单的例子,来演示抛出的异常没有任何由我的应用程序引起的开销。

TIA

最佳答案

试试这个:-

private OnTouchListener drag = new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
setViewPosition(v, Math.round(event.getRawX()),
Math.round(event.getRawY()));
}
return false;
}
};


private void setViewPosition(View v, int x, int y) {
if (v != null) {
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
params.leftMargin = (x - v.getMeasuredWidth() / 2);
params.topMargin = (y - v.getMeasuredHeight() / 2);
v.setLayoutParams(params);
v.invalidate();
}
}

关于android - 在 android 3.x 中拖放少量后会导致 illegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9567210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com