这两天小弟一直被一个问题困扰着,(可能由于小弟的开发经验不多,没有注意到这一个问题是什么一回事),但是,Now!我解决掉啦,不管问题的解决方案是否最好的,至少我能实现了。问题如下:
情景描述:(还是使用图片来展示吧)
下面是大概的示意图
在Activity中的代码如下:(这些代码是还没有解决问题之前的,就如图1与图2描述那样的)
public class Login extends Activity implements IWeiBoAct{
private static final String TAG = "Login";
private Button btnAddUser;
private GridView gridView;
private PopupWindow popupWindow;
private static final int AddUserID =1;
private Weibo weibo=null;
private RequestToken requestToken = null;
private PopupWindow pw = null;
private LoginGridViewAdapter lga=null;//问题未解决前的lga定义声明,这里提前给出我的解决方案:把它改成这个private static ....
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i(TAG,"Login--->onDestroy()");
dismissPopupWin();
Log.i(TAG,"停止WeiBoService服务");
stopService(new Intent(Login.this,WeiBoService.class));
Log.i(TAG,"lga"+lga);
//lga=null;
}
/**
* 将泡泡式窗口dismiss().
*/
private void dismissPopupWin() {
if(pw!=null&&pw.isShowing()){
pw.dismiss();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
init();
Log.i(TAG,"启动WeiBoService服务");
startService(new Intent(Login.this,WeiBoService.class));
//Log.i(TAG,"从数据中查找出所有用户信息....");
Map<String, Object> taskParams = new HashMap<String, Object>(1);
taskParams.put("Login.this", Login.this);
addTaskInWeiBoService(Login.this,
Task.LOGIN_SEARCH_FOR_ALL_USERS_FROM_DB,taskParams);
/*DBService dbService = new DBService(Login.this);
List<User> allUser = dbService.findAllUser(); */
//gridView.setAdapter(new LoginGridViewAdapter(this,allUser));
}
/**
* 往WeiBoService服务进程中添加任务
* @param activity 当前Activity
* @param taskId 任务ID
* @param taskParams 任务所需要的参数
*/
private void addTaskInWeiBoService(Activity activity,int taskId,Map<String, Object> taskParams){
//TODO 从数据中查找出所有用户信息 2012.3.13
WeiBoService.newTask(new Task(taskId,taskParams));
WeiBoService.addActivity(activity);
}
/**
* Login控件初始化
*/
public void init() {
gridView =(GridView)this.findViewById(R.id.login_ShowUser_gridview);
gridView.setOnItemClickListener(icl);
btnAddUser =(Button)this.findViewById(R.id.login_btn_addUser);
btnAddUser.setOnClickListener(btnCL);
lga = new LoginGridViewAdapter(this,null);//在onCreate(.)中生成lga对象
Log.i(TAG,"lga-->1--->"+lga);//输出此时的lga值
gridView.setAdapter(lga);
}
/**
* 获得从WeiBoService服务里发送的数据,再更新界面
*/
public void refresh(Object... params) {
Log.i(TAG,"refresh(..)....获得从WeiBoService服务里发送的数据,再更新界面");
List<User> allUser = (List<User>) params[0];
Log.i(TAG,"allUser-->"+allUser.toString());
Log.i(TAG,"lga-->2--->"+lga);
//lga = new LoginGridViewAdapter(this,allUser);
lga.setContext(Login.this);
lga.setUsers(allUser);
Log.i(TAG,"lga-->3--->"+lga);
lga.notifyDataSetChanged();
//gridView.setAdapter(lga);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
super.dispatchTouchEvent(ev);
Log.i(TAG,"action:"+ev.getAction());
//Log.i(TAG,"dispatchTouchEvent..."+ev.toString());
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
Log.i(TAG,"dismiss..pw");
dismissPopupWin();
break;
default:
break;
}
return false;
}
private OnItemClickListener icl = new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View view, int position,
long id) {
Log.i(TAG,"position--->"+position+":id--->"+id);
//TODO 在这里设置点击Item时,取得Item的用户信息数据,发送给后台WeiBoService 2012.3.10
User user = (User)arg0.getItemAtPosition(position);
Log.i(TAG, " userName: "+user.getName()
+" userId: "+user.getId());
//使用getChildAt(int position)方法,根据position来返回这个View
View childView =arg0.getChildAt(position);
showPaopaoWin(childView,user);
}
};
/**
* 当点击ListView时某个项目时,弹出一个popupWindow式窗口
* @param view 在某个view下显示出来
*/
private void showPaopaoWin(View view,final User user){
Log.i(TAG,"正在弹出泡泡式窗口...");
View popupWinView = getLayoutInflater().inflate(R.layout.paopao,null);
ImageButton imgBtn1 = (ImageButton)popupWinView.findViewById(R.id.paopao_imgBtn1);
imgBtn1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
imgBtn$Click(v,user);
}
});
if(pw == null)
{
pw = new PopupWindow(popupWinView,LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);;
//当点击外面的界面时,响应点击事件
pw.setOutsideTouchable(true);
}else if(pw.isShowing()){
pw.dismiss();
}
pw.showAsDropDown(view,50,0);
}
private OnClickListener cl = new OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.login_dialog_btn_load:
Log.i(TAG, "btn_load");
break;
case R.id.login_dialog_btn_cancel:
Log.i(TAG, "btn_cancel");
popupWindow.dismiss();
default:
break;
}
}
};
private Dialog addUserDialog(Context context){
Log.i(TAG,"addUserDialog create!!");
AlertDialog.Builder builder;
builder = new AlertDialog.Builder(Login.this);
builder.setView(null);
builder.setTitle(R.string.Into_the_authorized_page_hints);
builder.setIcon(R.drawable.ic_launcher);
builder.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Log.i(TAG,"--------------------------------");
Log.i(TAG,"得到weibo实例。。。");
weibo = new Weibo();//OAuthConstant.getInstance().getWeibo();
weibo.setOAuthConsumer(OAuthConstant.CONSUMER_KEY,OAuthConstant.CONSUMER_SECRET);
Log.i(TAG,"开辟线程,来初始化weibo实例。。。");
new Thread(){
public void run() {
Log.i(TAG,"线程运行开始....");
try
{
// yang://JustForYang是回调地址,当授权结束后,就会运行这个Activity,它在Manifest文件中
//<intent-filter><action android:name="android.intent.action.VIEW" />
//<category android:name="android.intent.category.DEFAULT" />
// <category android:name="android.intent.category.BROWSABLE" />
// <data android:scheme="tree" android:host="Growing" /> </intent-filter>
requestToken = weibo.getOAuthRequestToken("yang://JustForYang");
Log.i(TAG,"Token--->"+requestToken.getToken()
+"::::TokenSecret--->"+requestToken.getTokenSecret()
);
OAuthConstant.getInstance().setRequestToken(requestToken);
Log.i(TAG,"Token--->"+requestToken.getToken()+"::::TokenSecret--->"+requestToken.getTokenSecret());
Uri uri = Uri.parse(requestToken.getAuthenticationURL());
Log.i(TAG,"uri--->"+uri.toString());
Log.i(TAG,"启动系统自带的浏览器...");
startActivity(new Intent(Intent.ACTION_VIEW, uri));
finish();
}
catch (WeiboException e)
{e.printStackTrace();}
};
}.start();
Log.i(TAG,"--------------------------------");
dialog.cancel();
}
});
builder.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
}
});
return builder.create();
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case AddUserID:
return addUserDialog(Login.this);
default:
break;
}
return super.onCreateDialog(id);
}
/**
* 用户登录按钮
* @param v
* @param user
*/
private void imgBtn$Click(View v,User user) {
dismissPopupWin();
//(未完成)跳转到MainActivity中 在WeiBoService中写代码来区分登录标识。。。TODO 2012.3.13晚
startActivity(new Intent(Login.this,MainActivity.class));
// TODO 2012.3.13向WeiBoService中发送登录命令
//TODO 将user发送给WeiBoService 2012.3.10
//应该放在WeiBoService中
DBService dbService = new DBService(Login.this);
AccessToken accessToken = dbService.findAccessTokenFromUser(String.valueOf(user.getId()));
Map<String, Object> taskParams = new HashMap<String, Object>();
taskParams.put("accessToken", accessToken);
Log.i(TAG,"在Login界面上选择的用户登陆...");
WeiBoService.newTask(new Task(Task.WEIBO_LOGIN,taskParams));
WeiBoService.addActivity(Login.this);
//结束当前登录窗口
finish();
}
private OnClickListener btnCL = new OnClickListener() {
public void onClick(View v) {
switch(v.getId()){
case R.id.login_btn_addUser:
Log.i(TAG,"click login_btn_addUser");
showDialog(AddUserID);
//showPaopaoWin(v);
break;
default :
break;
}
}
};
}
//WeiBoService代码不贴出来了,WeiBoService里的代码结构 同传智播客-3G手机Android应用新浪微博 里的代码结构一样的
在LogCat中得到的信息如下:
但是再次运行后,在LogCat中得到的信息如下:
所以,综上所述,出现问题的原因很简单了。
*******************************我的解决方案******************************
在声明LoginGridViewAdapter实例对象时
public class Login extends Activity implements IWeiBoAct{
//。。。。
private static LoginGridViewAdapter lga=null;//将之前的private LoginGridViewAdapter lga=null;改成这样
//.........
再次部署到模拟器上,查看LogCat里输出的日志信息
再次运行。。。
最终效果(嘻嘻,图片最低的小图是我的 sina weibo,求关注)
//*****************************************************************************
后记:
学习anroid应用开发已有差不多一年时间了吧(这里的一年可以是四分之三吧,中间有几个月没有接触电脑和android了,所以...),后来想了想,如何才能学习更多相关知识呢,倒不如来跟着weibo教程来写代码吧,反正自己的java知识不够充实,只是边学边用而已,
其实上面所述的问题我早就碰到过了,只是一时想不明白为什么是这样的,前几天,脑中实然想到LogCat这个实用工具,于是乎。。。
好吧,这是我在CSDN上写的第一篇文章,以前很少写技术文章的(其实我的android技术不好的,一直把自己定位在初学者阶段),但无论这篇文章在你们眼里觉得好不好,我只是把它当成经验总结,方便以后查阅时,想起来还有static这个关键字的好作用。
加油!