关于BaseAdapter和GridView与后台Service服务进程交换数据的小小的经验总结

来源:互联网 发布:无人机航拍测量软件 编辑:程序博客网 时间:2024/06/04 00:24
这两天小弟一直被一个问题困扰着,(可能由于小弟的开发经验不多,没有注意到这一个问题是什么一回事),但是,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 ....@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.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();}}@Overrideprotected 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.13WeiBoService.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);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {// TODO Auto-generated method stubsuper.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.10User user = (User)arg0.getItemAtPosition(position);Log.i(TAG, " userName: "+user.getName()+" userId: "+user.getId());//使用getChildAt(int position)方法,根据position来返回这个ViewView 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();}@Overrideprotected 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这个关键字的好作用。

加油!