专业术语说不好!代码贴上。看我这样传递方法合适吗?这是要实现加载数据等待...
做了一个通用的progressbar的类
package my.android.test;import android.app.ProgressDialog;
import android.content.Context;
import android.os.Handler;/**
* @author TMajier
* 等待窗体
*/
public class LoadWaiting {
ProgressDialog waitDialog;
Context mContext;
Handler waiHandler = null; public LoadWaiting(Context context, Delegate loadDataDelegate,
Delegate changeViewDelegate) {
this.mContext = context;
this.loadDataDelegate = loadDataDelegate;
this.changeViewDelegate = changeViewDelegate;
waiHandler = new Handler();
waitDialog = new ProgressDialog(mContext);
waitDialog.setMessage("正在读取中...");
} public void showLoadWaiting() {
waitDialog.show();
new Thread(new Runnable() {
public void run() {
// 加载数据的方法
loadDataDelegate.delegateFunction();
waiHandler.post(new Runnable() {
public void run() {
// 加载完成后更改界面的方法
changeViewDelegate.delegateFunction();
waitDialog.dismiss();
}
});
}
}).start();
} private Delegate loadDataDelegate; private Delegate changeViewDelegate; public interface Delegate {
void delegateFunction();
}
}
其中我是使用定义接口的办法,实现方法的重新定义的。我知道在抽象类中写抽象方法也可以,子类必须继承,但是不灵活。调用:package my.android.test;import my.android.test.LoadWaiting.Delegate;
import my.android.test.R.id;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class TestProgressbar extends Activity {
TextView tv;
Button btn; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.testprogressbar);
tv = (TextView) findViewById(R.id.testprogressbar_txt);
btn = (Button) findViewById(id.testprogress_btn); btn.setOnClickListener(btnClickListener);
}
OnClickListener btnClickListener = new OnClickListener() { public void onClick(View v) {
LoadWaiting loadWaiting = new LoadWaiting(TestProgressbar.this,
loadDataDelegate, changeViewDelegate);
loadWaiting.showLoadWaiting();
}
};
String str = "";
// 方法
Delegate loadDataDelegate = new Delegate() { public void delegateFunction() {
for (int i = 0; i < 1000000; i++) {
str = "abcdefg";
}
}
};
// 方法
Delegate changeViewDelegate = new Delegate() { public void delegateFunction() {
tv.setText(str);
}
};
}这样实现是实现了,但觉得有点麻烦。能不能直接传递函数。
比如
private void loadDataDelegate()
{}
private void changeViewDelegate()
{}
LoadWaiting loadWaiting = new LoadWaiting(TestProgressbar.this,
loadDataDelegate, changeViewDelegate);
loadWaiting.showLoadWaiting();能不能这样传递
做了一个通用的progressbar的类
package my.android.test;import android.app.ProgressDialog;
import android.content.Context;
import android.os.Handler;/**
* @author TMajier
* 等待窗体
*/
public class LoadWaiting {
ProgressDialog waitDialog;
Context mContext;
Handler waiHandler = null; public LoadWaiting(Context context, Delegate loadDataDelegate,
Delegate changeViewDelegate) {
this.mContext = context;
this.loadDataDelegate = loadDataDelegate;
this.changeViewDelegate = changeViewDelegate;
waiHandler = new Handler();
waitDialog = new ProgressDialog(mContext);
waitDialog.setMessage("正在读取中...");
} public void showLoadWaiting() {
waitDialog.show();
new Thread(new Runnable() {
public void run() {
// 加载数据的方法
loadDataDelegate.delegateFunction();
waiHandler.post(new Runnable() {
public void run() {
// 加载完成后更改界面的方法
changeViewDelegate.delegateFunction();
waitDialog.dismiss();
}
});
}
}).start();
} private Delegate loadDataDelegate; private Delegate changeViewDelegate; public interface Delegate {
void delegateFunction();
}
}
其中我是使用定义接口的办法,实现方法的重新定义的。我知道在抽象类中写抽象方法也可以,子类必须继承,但是不灵活。调用:package my.android.test;import my.android.test.LoadWaiting.Delegate;
import my.android.test.R.id;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class TestProgressbar extends Activity {
TextView tv;
Button btn; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.testprogressbar);
tv = (TextView) findViewById(R.id.testprogressbar_txt);
btn = (Button) findViewById(id.testprogress_btn); btn.setOnClickListener(btnClickListener);
}
OnClickListener btnClickListener = new OnClickListener() { public void onClick(View v) {
LoadWaiting loadWaiting = new LoadWaiting(TestProgressbar.this,
loadDataDelegate, changeViewDelegate);
loadWaiting.showLoadWaiting();
}
};
String str = "";
// 方法
Delegate loadDataDelegate = new Delegate() { public void delegateFunction() {
for (int i = 0; i < 1000000; i++) {
str = "abcdefg";
}
}
};
// 方法
Delegate changeViewDelegate = new Delegate() { public void delegateFunction() {
tv.setText(str);
}
};
}这样实现是实现了,但觉得有点麻烦。能不能直接传递函数。
比如
private void loadDataDelegate()
{}
private void changeViewDelegate()
{}
LoadWaiting loadWaiting = new LoadWaiting(TestProgressbar.this,
loadDataDelegate, changeViewDelegate);
loadWaiting.showLoadWaiting();能不能这样传递
你用的方法已经是符合OO的设计原则 ,JAVA 没有C 那样直接传 函数指针的方法,所以,你想传函数指针是不可能的。
个人觉得,唯一可以改进的地方是把loadDataDelegate 和changeViewDelegate函数抽象到一个interface里面。这样不用传两个参数进去。
public interface Delegate {
void delegateDate();
void delegateView();
}
主要想问问有没有类似与c#那样的委托与事件呢?
比如:delegate EventHandler(string str)
EventHandler event;java中是不是没有这样的写法?
Handler的 public void handleMessage(Message msg) 方法你看看是不是你需要的。
在定义通用类时,如果是作为基类的话,那就直接抽象化,然后把需要的抽象方法全部加进去,这样就约束了子类的行为....
但是如果通用类中,不适合做基类,那就直接定义一个标准的接口,把需要的变量或信息写在接口中。用接口来约束其调用。
学完C#再学java,感觉各有优点吧!java的层次以及架构很有利于我们这些菜鸟思想上的进步的。