gpt4 book ai didi

Java,使用接口(interface)作为回调

转载 作者:行者123 更新时间:2023-12-01 07:36:16 24 4
gpt4 key购买 nike

我一直在为 Android 开发一个简单的触摸处理程序,可以触发像 onUpdate(触摸屏幕时)这样的回调,而无需设置线程。我的问题是我对Java的了解相当有限,我无法做到这一点,因为我对如何使用接口(interface)知之甚少。我很确定我的问题可能是一个简单的拼写错误或其他问题,但是当我从触摸处理程序(处理触摸信息)执行该方法时,我得到一个 NullPointerException ,以便我可以在主 Activity 类中执行我需要的操作.

这是主类代码(剔除不相关的内容):

//package and imports

public class Test extends Activity implements TouchHelper {

StringBuilder builder = new StringBuilder();
TextView textView;
TouchReader touchReader;
List<TouchTable> touchTablesArray;
TouchTable touchTable;
public static final String Tag = "TouchTest";

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
textView = new TextView(this);
Log.d(Tag, "TextView initialized " + textView);
textView.setText("Touch and drag (multiple fingers supported)!");
touchReader = new TouchReader(textView);
Log.d(Tag, "touchReader initialized");
touchTablesArray = touchReader.getTouchTables();
setContentView(textView);
}

@Override
public void onTouchUpdate(int pointerId)
{
Log.d(Tag, "onTouchUpdate called");
touchTable = touchTablesArray.get(pointerId);
Log.d(Tag, "touchTable get successful");
//writing on stringbuilder
}
}

这是处理程序本身的代码:

//package and imports

public class TouchReader implements OnTouchListener
{
public final static String Tag = "TouchReader";
List<TouchTable> touchTables;
TouchHelper helper;
TouchTable touchTable = new TouchTable();

public TouchReader(View view)
{
view.setOnTouchListener(this);
touchTables = new ArrayList<TouchTable>(10);
Log.d(Tag, "TouchReader initialized");
}

public boolean onTouch(View v, MotionEvent event)
{
synchronized(this)
{
//all the common code handling the actual handling, with switches and such
touchTables.add(pointerId, touchTable); //obviously the pointerId is defined earlier
Log.d(Tag, "Values updated");
helper.onTouchUpdate(pointerId); //the exception is here
Log.d(Tag, "Update called");
}
return true;
}
public List<TouchTable> getTouchTables()
{
synchronized(this)
{
return touchTables;
}
}
}

正如您所看到的,该错误很可能是由于我无法正确使用界面而导致的,但所有官方文档让我更加困惑。

最后是界面的小代码:

//package

public interface TouchHelper
{
public void onTouchUpdate(int pointerId);
}

我希望这个问题不会太幼稚,不能在这里发布:)

编辑:感谢大家的帮助,最终我遵循了 Bughi 的解决方案。

最佳答案

您的 TouchHelper helper; 为 null,它需要接口(interface)的实例才能调用其上的方法 - 在您的情况下是实现您的接口(interface)的主 Activity 类 -

为监听器创建一个set方法

public void setOnTouchListener(TouchHelper helper)
{
this.helper = helper;
}

然后在创建时调用它:

public class Test extends Activity implements TouchHelper {
...
@Override
public void onCreate(Bundle savedInstanceState)
{
...
touchReader = new TouchReader(textView);
touchReader.setOnTouchListener(this);
...
}
}

还要向您的 on touch 方法添加空检查:

public boolean onTouch(View v, MotionEvent event)
{
synchronized(this)
{
//all the common code handling the actual handling, with switches and such
touchTables.add(pointerId, touchTable); //obviously the pointerId is defined earlier
Log.d(Tag, "Values updated");
if (helper != null)
helper.onTouchUpdate(pointerId); //the exception is here
Log.d(Tag, "Update called");
}
return true;
}

关于Java,使用接口(interface)作为回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594397/

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