个人代码记录
转载请注明出处:http://blog.csdn.net/etong_123/article/details/17428571
用多了Android的OnClickListener,OnTouchListener 等回调方法,打算自己动手写一个。
C++实现回调的方式是用指针,java当然也有自己实现回调的方式。先定义接口
这里定义一个动作类
public interface MyAction {
public void dosomething();
}
定义实现类
这里用MyAction作为参数
public class Test {
public void call(MyAction ma) {
Log.i("etong", "befor doing");
ma.dosomething();
Log.i("etong", "after doing");
}
}
在MainActivity中实现
dosomething的方法由调用者来实现
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Test test = new Test();
test.call(new MyAction() {
@Override
public void dosomething() {
// TODO Auto-generated method stub
Log.i("etong", "doing");
}
});
}
}
打印结果
只是个简单的例子,了解一下java回调的写法。
顺手写了个Android进度条更新,用了回调的写法。直接贴代码
接口 定义更新进度条抽象方法
public interface ProgressListener {
public void onProgress(int index);
}
实现类 通过线程累加进度条的参数
public class ProgressHandler {
private ProgressListener progressListener;
private int index = 0;
public ProgressHandler() {
}
public void setProgress(ProgressListener p) {
this.progressListener = p;
}
public void update() {
// 用线程增加index
new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while (index < 100) {
index++;
//通知进度条更新进度
progressListener.onProgress(index);
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}.start();
}
}
Activity代码
public class TestActivity extends Activity {
private ProgressBar progressBar;
private ProgressHandler progressHandler;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
progressHandler = new ProgressHandler();
progressHandler.setProgress(new ProgressListener() {
@Override
public void onProgress(int index) {
// TODO Auto-generated method stub
progressBar.setProgress(index);
}
});
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
progressHandler.update();
}
});
}
}
Xml代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".TestActivity" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start" />
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
通过回调的方式通知进度条更新。