请教高手,在加载等待中你们平时都是怎么传递事件或者说是方法的专业术语说不好!代码贴上。看我这样传递方法
请教高手,在加载等待中你们平时都是怎么传递事件或者说是方法的
专业术语说不好!代码贴上。看我这样传递方法合适吗?这是要实现加载数据等待...
做了一个通用的progressbar的类
- Java code
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(); }}其中我是使用定义接口的办法,实现方法的重新定义的。我知道在抽象类中写抽象方法也可以,子类必须继承,但是不灵活。
调用:
- Java code
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();
能不能这样传递
[解决办法]
使用asynctask比较常用
[解决办法]
亲,不好意思,刚才没有认真看你的代码,通过interface 抽象需要调用的方法,比我刚才说的直接传this指针要好,因为interface 分离了依赖。LoadWaiting 类不需要知道有个TestProgressbar 类的存在。
你用的方法已经是符合OO的设计原则 ,JAVA 没有C 那样直接传 函数指针的方法,所以,你想传函数指针是不可能的。
个人觉得,唯一可以改进的地方是把loadDataDelegate 和changeViewDelegate函数抽象到一个interface里面。这样不用传两个参数进去。
public interface Delegate {
void delegateDate();
void delegateView();
}
[解决办法]
我用handler
