运行AsyncTask时不显示布局

时间:2012-12-22 04:07:53

标签: android multithreading android-asynctask

我有一个启动画面的活动,它在布局中只有一个图像。我想在后台进行一些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();
        }
}

2 个答案:

答案 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授权请求的结果。