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

这两天小弟一直被一个问题困扰着,(可能由于小弟的开发经验不多,没有注意到这一个问题是什么一回事),但是,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这个关键字的好作用。

加油!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值