我有一个启动画面的活动,它在布局中只有一个图像。我想在后台进行一些Http调用,同时在UI线程中显示启动画面。但是当我执行AsyncTask时,不会显示布局中的图像。我只得到一个空白屏幕,让我相信布局本身没有加载。以下是活动代码。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
String authReqResponse;
Toast errorDisplayToast = new Toast(this);
AuthorizationRequest authReq = new AuthorizationRequest();
authReq.execute(new Void[] {});
try {
authReqResponse = authReq.get();
if(authReqResponse.equalsIgnoreCase(GeneralConstants.AUTH_FAILED_ERROR)) {
errorDisplayToast.makeText(SplashScreen.this, R.string.request_auth_failed_error_message, Toast.LENGTH_LONG);
errorDisplayToast.show();
} else if(authReqResponse.equalsIgnoreCase(null)) {
errorDisplayToast.makeText(SplashScreen.this, R.string.networkErrorMessage, Toast.LENGTH_LONG);
errorDisplayToast.show();
} else {
GeneralConstants.REQ_TOKEN = authReqResponse;
Intent startARIntent = new Intent(SplashScreen.this, MainActivity.class);
startActivity(startARIntent);
finish();
}
} catch(Exception e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
这里
try {
authReqResponse = authReq.get();///<<get method of AsyncTask
//your code....
作为关于AsyncTask. get (long timeout, TimeUnit unit) :的文档
如果需要,最多等待计算的给定时间 完成,然后检索其结果。
表示如果使用此方法将结果从AsyncTask返回到UI主线程,那么它将停止主UI执行,直到从AsyncTask的doInBackground方法返回结果
解决方案是使用onPostExecute
在AsyncTask执行完成时更新UI元素
答案 1 :(得分:0)
这是一种与AsyncTask交互的非常奇怪的方式。你确实意识到execute()
是非阻塞的,对吧? try
块将在execute
之后立即执行。此外,执行完任务后,authReq
将不确定。您需要在Activity
实例上使用侦听器重写该位。
其次,你可以authReq.execute()
,这会传递一个空白。
最后,要调试启动画面,请将其缩小为:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
}
确认它有效。然后继续修复AsyncTask
以通知活动onPostExecute授权请求的结果。