Android端DynamoDB加载用户时出现NullPointerException问题求助
解决AsyncTask导致的NullPointerException问题
嘿,我一眼就看出问题所在了——你掉进了AsyncTask异步执行的坑里啦!
问题根源
你触发空指针的核心原因是AsyncTask的异步特性:当你调用checkIfEmailNull.execute()后,主线程会立刻继续执行后面的if (userB.getUserId() == ...)代码,但这时候后台线程的doInBackground()还没跑完,userB根本还没被赋值,还是个null,调用它的getUserId()方法自然就抛出空指针了。
标准解决方案:把结果处理逻辑移到onPostExecute()
AsyncTask设计的初衷就是让后台任务执行完后,在onPostExecute()(主线程)里处理结果。我们需要修改你的代码,把原本在主线程直接访问userB的逻辑移到这个方法里:
修改后的AsyncTask代码
class CheckIfEmailNull extends AsyncTask<String, Void, SecureUsersDO> { private DynamoDBMapper dynamoDBMapper; private Profile profileTest; // 传入需要比对的Profile对象 // 构造方法传入Profile,方便后续在主线程处理逻辑 public CheckIfEmailNull(Profile profileTest) { this.profileTest = profileTest; } @Override protected SecureUsersDO doInBackground(String... userID) { AmazonDynamoDBClient dynamoDBClient = new AmazonDynamoDBClient(AWSMobileClient.getInstance().getCredentialsProvider()); this.dynamoDBMapper = DynamoDBMapper.builder() .dynamoDBClient(dynamoDBClient) .awsConfiguration(AWSMobileClient.getInstance().getConfiguration()) .build(); // 直接返回查询到的用户对象,不需要全局变量userB return dynamoDBMapper.load(SecureUsersDO.class, userID[0]); } @Override protected void onPostExecute(SecureUsersDO userB) { // 这里是主线程,安全处理结果 if (userB == null) { Log.d("CheckIfEmailNull", "未找到对应ID的用户"); return; } // 注意用equals比对字符串,不要用== if (userB.getUserId().equals(profileTest.getCurrentProfile().getId())) { Log.d("ID's match: ", "attempting"); if (userB.getEmail() == null) { Log.d("TODO", "Write code to show we need email"); Log.d("User B is : ", userB.getFirstName()); } } } }
修改后的启动方法checkUserEmail
public void checkUserEmail(Profile profileTest){ Log.d("checkUserEmail>>>", profileTest.getId().toString()); // 把Profile传入AsyncTask的构造方法 CheckIfEmailNull checkIfEmailNull = new CheckIfEmailNull(profileTest); checkIfEmailNull.execute(profileTest.getId().toString()); // 原来的逻辑已经移到onPostExecute里了,这里不要再处理userB! }
额外注意事项
- 永远不要在调用
execute()后立刻访问AsyncTask处理的结果,后台线程的执行是异步的,主线程不会等待它完成。 - 比对字符串时,尽量用
equals()而不是==,==比对的是对象引用,equals()才是比对字符串内容。 - 一定要对查询结果
userB判空,避免因为数据库中没有对应ID的用户而再次触发空指针。
内容的提问来源于stack exchange,提问作者Ronald Pitt
相关产品推荐
相关产品推荐

