专业术语说不好!代码贴上。看我这样传递方法合适吗?这是要实现加载数据等待...
    做了一个通用的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,
loadDataDelegatechangeViewDelegate);
loadWaiting.showLoadWaiting();能不能这样传递

解决方案 »

  1.   

    亲,传this 进去,然后通过this 调用loadDataDelegate 和changeViewDelegate函数
      

  2.   

    如果你觉得把一个Activity传入LoadWaiting 类会有严重的依赖关系,可以把loadDataDelegate 和changeViewDelegate封装在一个interface里面,然后TestProgressbar 实现这个interface, 把这个interface传入 LoadWaiting ,这样就消除了依赖关系。
      

  3.   

    亲,不好意思,刚才没有认真看你的代码,通过interface 抽象需要调用的方法,比我刚才说的直接传this指针要好,因为interface 分离了依赖。LoadWaiting 类不需要知道有个TestProgressbar 类的存在。
    你用的方法已经是符合OO的设计原则 ,JAVA 没有C 那样直接传 函数指针的方法,所以,你想传函数指针是不可能的。
    个人觉得,唯一可以改进的地方是把loadDataDelegate 和changeViewDelegate函数抽象到一个interface里面。这样不用传两个参数进去。
    public interface Delegate {
            void delegateDate();
            void delegateView();
        }
      

  4.   

    谢谢你的回答!
    主要想问问有没有类似与c#那样的委托与事件呢?
    比如:delegate EventHandler(string str)
          EventHandler event;java中是不是没有这样的写法?
      

  5.   

    亲,没玩过C#, 不过Android有handler ,貌似跟你这个EventHandler 有点类似,你可以看看
      

  6.   

    晕,你已经用了handler 了,偶悔过。
    Handler的 public void handleMessage(Message msg) 方法你看看是不是你需要的。
      

  7.   

    谢谢大家了,结贴了!感谢fishmen的建议! 
    在定义通用类时,如果是作为基类的话,那就直接抽象化,然后把需要的抽象方法全部加进去,这样就约束了子类的行为....
    但是如果通用类中,不适合做基类,那就直接定义一个标准的接口,把需要的变量或信息写在接口中。用接口来约束其调用。
    学完C#再学java,感觉各有优点吧!java的层次以及架构很有利于我们这些菜鸟思想上的进步的。