Android编程之匿名内部类与回调函数用法分析

  

Android编程之匿名内部类与回调函数用法分析

什么是匿名内部类

匿名内部类是一种没有类名的内部类,直接使用new来创建,并且实现了某个接口或者继承了某个类。使用场景通常是在需要实现较为简单的接口或者重写某个类中的方法时使用,避免了创建过多的类文件。

如何使用匿名内部类实现回调函数

在Android编程中,回调函数通常用于实现异步处理,将处理结果返回给调用者。使用匿名内部类可以方便实现一个回调接口,并在需要的时候创建该接口的实例,实现异步处理。

例子

下面通过两个例子,分别说明如何使用匿名内部类实现回调函数。

例子一:实现线程池异步处理并返回结果

public class MyActivity extends Activity {
    private Handler mHandler = new Handler();
    private ExecutorService mExecutorService = Executors.newCachedThreadPool();
    private Callback mCallback;

    public interface Callback {
        void onSuccess(String result);

        void onFailed(String error);
    }

    public void doSomethingAsynchronous(final Callback callback) {
        mExecutorService.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    String result = "do something";
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onSuccess(result);
                        }
                    });
                } catch (Exception e) {
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onFailed(e.getMessage());
                        }
                    });
                }
            }
        });
    }

    public void onStart() {
        super.onStart();
        mCallback = new Callback() {
            @Override
            public void onSuccess(String result) {
                // TODO 处理成功结果
            }

            @Override
            public void onFailed(String error) {
                // TODO 处理失败结果
            }
        };

        doSomethingAsynchronous(mCallback);
    }
}

这个例子中,我们通过创建一个Callback接口,来实现异步处理完成之后返回处理结果给调用者的功能。Callback接口有两个方法onSuccess和onFailed,用来分别处理异步处理成功和失败的情况。

我们在doSomethingAsynchronous方法中,将Callback对象作为参数传入,并利用线程池来异步处理。处理完成之后,通过Handler来回调到UI线程,并调用Callback对象的相应方法来返回处理结果。

在onStart方法中,我们通过创建一个匿名内部类的方式,实现了Callback接口,并在doSomethingAsynchronous方法中传入该匿名内部类的实例,从而实现回调函数的功能。

例子二:实现ListView的Item点击事件

public class MyActivity extends Activity {
    private List<String> mData = new ArrayList<>();

    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        // TODO 处理ListView Item点击事件
    }

    public void onStart() {
        super.onStart();
        ListView listView = findViewById(R.id.list_view);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mData) {
            @NonNull
            @Override
            public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                View view = super.getView(position, convertView, parent);
                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onItemClick(null, v, position, mData.get(position));
                    }
                });
                return view;
            }
        };
        listView.setAdapter(adapter);
    }
}

这个例子中,我们通过ListView的setOnItemClickListener方法来实现Item点击事件的监听。但是在这里我们使用了匿名内部类的方式,来自定义ListView的Adapter,并实现了ListView Item点击事件的监听。

在getView方法中,我们为每个Item添加了一个点击事件监听器,当点击事件触发时,我们通过调用onItemClick方法来处理我们需要的业务逻辑。

同样的,我们通过创建一个匿名内部类的方式来实现View.OnClickListener接口,并在onClick方法中调用onItemClick来处理ListView Item点击事件。

总结

通过上面的例子,我们可以看到匿名内部类和回调函数在Android编程中的广泛应用,这种方法能够简化代码的编写,并实现代码的可读性和可维护性。当我们在处理异步任务或者点击事件的时候,我们可以借鉴上面的例子,来使用匿名内部类和回调函数。

相关文章