5
回答
Android 在线程内调用API获取服务器端数据失败的问题,请看详细描述
华为云实践训练营,热门技术免费实践!>>>   

问题是这样的,我有一个更新按钮,点击的时候会调用两个API接口查询服务器端数据。一个是查询所有用户信息(标记为A),另一个是查询用户分组信息(标记为B),在我多次点击更新按钮时(大概十几次),会出现A获取数据失败的情况,allUsers 控制台打印为null,代码如下:

private class FlushGroupButtonClickListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			fl_show_topload.setVisibility(View.VISIBLE);
			topCenterTextView.setEnabled(false);
			// 点击更新时 要重新取得-登录用户与所有用户关系的用户列表- 和 -登录用户的关注分组信息-
			// 登录用户与所有用户关系的用户list
			final List<Map<String,String>> allUserList = new ArrayList<Map<String,String>>();

			new Thread(new Runnable() {
				@Override
				public void run() {
					Message msg = handler.obtainMessage(4);
					// 创建数据库
					DatabaseHelper dbHelper=new DatabaseHelper(MyFriendsActivity.this, "my_databases", null, 1);
					SQLiteDatabase db=dbHelper.getWritableDatabase();

					// 根据当前用户ID删除与之相关的所有注册用户信息
					dbHelper.deleteUsersByLoginUserID(db);

					// 取得登录用户与所有用户关系的用户列表
					String allUsers = MobileAPI.getAllUsers(MyFriendsActivity.this, map);

					if (allUsers.equals("{error:timeOut}")) {
						//new Utility().exitProgrames(context);
					} else if (allUsers.equals("{error:error}")) {
						//new Utility().exitProgrames(context);
					} else {

						List<Map<String,Object>> listAllUser = MobileAPI.findData(allUsers);

						for(Map<String,Object> m : listAllUser){
							mapInfo = new HashMap<String, String>();

							mapInfo.put("id", (String) m.get("id"));
							mapInfo.put("name", (String) m.get("name"));
							mapInfo.put("screen_name", (String) m.get("screen_name"));
							mapInfo.put("profile_image_url", (String) m.get("profile_image_url"));
							mapInfo.put("friends_count", (String) m.get("subscribed"));
							mapInfo.put("followers_count", (String) m.get("following"));

							allUserList.add(mapInfo);
						}
					}
					// 登录时插入所有的注册用户信息
					dbHelper.insertUsers(db,allUserList);
					db.close();
					msg.sendToTarget();
				}
			}).start();

			// 登录用户关注分组list
			final List<Map<String,String>> allSortList = new ArrayList<Map<String,String>>();

			new Thread(new Runnable() {
				
				@Override
				public void run() {
					// TODO Auto-generated method stub
					// 创建数据库
					DatabaseHelper dbHelper1=new DatabaseHelper(MyFriendsActivity.this, "my_databases", null, 1);
					SQLiteDatabase db1=dbHelper1.getWritableDatabase();

					// 根据当前登录用户ID删除与之相关的所有用户分组表
					dbHelper1.deleteUsersortByLoginUserID(db1);

					// 取得登录用户关注分组信息
					String allSorts = MobileAPI.getMySortInfo(MyFriendsActivity.this,map);

					if (allSorts.equals("{error:timeOut}")) {
						//new Utility().exitProgrames(context);
					} else if (allSorts.equals("{error:error}")) {
						//new Utility().exitProgrames(context);
					} else {

						List<Map<String,Object>> listAllSorts = MobileAPI.findData(allSorts);

						for(Map<String,Object> m : listAllSorts){
							mapInfo = new HashMap<String, String>();

							mapInfo.put("user_id", (String) m.get("sort_id"));
							mapInfo.put("sort_name", (String) m.get("sort_name"));

							allSortList.add(mapInfo);
						}
					}
					// 插入所有的分组信息
					dbHelper1.insertUsersort(db1,allSortList);
					db1.close();
				}
			}).start();

			if (popupWindow != null) {
				popupWindow.dismiss();
			}
		}

	}

 上述方法内的两个线程都是先删除原有数据库数据,再调用API查询新的数据,然后插入数据库。当更新按钮点多了,FATAL EXCEPTION : Thread -27 ,指向allUsers.equals("{error:timeOut}") 这一行空指针异常

举报
挖哈哈
发帖于5年前 5回/802阅
顶部