调用Salesforce REST接口后Android Fragment视图无法显示
问题分析与解决方案
首先,你的核心矛盾很明确:调用Salesforce REST API后Fragment无法加载,跳过API调用就一切正常。我一眼就看到了问题的根源——你在onCreate里用了这行危险的代码:
myAsyncTasks.execute(accessToken_, instanceURL_).get();
为什么这行代码会搞砸Fragment?
AsyncTask.get()是同步阻塞方法,它会强制主线程(UI线程)暂停所有工作,一直等到异步任务完成才继续往下走。这会导致:
- Activity的初始化流程被卡住,NavigationView、DrawerLayout这些组件的加载延迟甚至异常
- 后续的Fragment事务提交时机被彻底打乱,主线程阻塞状态下UI渲染根本无法正常执行
- 更严重的是,这种做法还可能触发ANR(应用无响应)弹窗
修复步骤(非常简单)
- 立刻移除
.get()调用,让AsyncTask真正在后台异步执行:
// 原来的错误代码 // myAsyncTasks.execute(accessToken_, instanceURL_).get(); // 修改为 myAsyncTasks.execute(accessToken_, instanceURL_);
AsyncTask的设计初衷就是异步执行后台任务,execute()本身就会自动调度后台线程,onPostExecute()会在任务完成后自动回到主线程更新UI,完全不需要用get()来强行同步。
保留你已正确实现的部分:
你的onPostExecute()方法里更新ListView的逻辑是对的,因为onPostExecute()本身就在UI线程运行,不需要额外处理线程切换。额外优化建议:
- 换掉过时的
DefaultHttpClient:这个类早就被Android官方弃用了,建议改用HttpURLConnection或者更易用的OkHttp来处理网络请求,兼容性和稳定性都更好 - 不要空抓异常:你现在的
try-catch块是空的,至少加个e.printStackTrace(),方便排查API调用中可能出现的错误 - 避免Activity强持有AsyncTask:可以考虑用ViewModel来管理异步任务,防止屏幕旋转等场景下的内存泄漏
- 换掉过时的
修复后的onCreate代码示例
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setNavigationDrawer(); accessToken_ = "00D7F000005oJve!ARUAQPJ8hMWibtO1flIPjZfzV4A__Kzj6wTjJ5XA_xE1zbqDs_0fOTZuxJFiLVxsFx_kNPxuNNK6c7yREtbxq4J7W1oWuUEs"; instanceURL_ = "https://harishgakhar40-dev-ed.my.salesforce.com"; listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>()); ((ListView) findViewById(R.id.contacts_list)).setAdapter(listAdapter); try { MyAsyncTasks myAsyncTasks = new MyAsyncTasks(); // 移除同步阻塞的.get(),让任务真正异步执行 myAsyncTasks.execute(accessToken_, instanceURL_); } catch (Exception e) { // 打印异常日志,方便排查问题 e.printStackTrace(); } }
验证效果
修改后重新运行App:
- API调用会在后台安静执行,ProgressDialog正常显示,不会卡住UI
- Activity的导航组件能正常初始化,菜单点击事件响应流畅
- 点击菜单选项时,Fragment能正常替换并显示内容
内容的提问来源于stack exchange,提问作者Harish
相关产品推荐
相关产品推荐

