0

我有我的 AndroidMainActivity和它的setContentView. 视图是黑色/蓝色渐变背景和ImageView. 这是我的onCreate

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
        * Activity elements
        * */
        ImageView rt_logo = (ImageView) findViewById(R.id.rt_logo);

        /**
        * Activity variables
        * */
        HttpGetRequest httpGetRequest = new HttpGetRequest(rt_logo);

        try {
        URI uri = new URI("http://www.myurl.com");
        URI[] uris = {uri};

        response = httpGetRequest.execute(uris).get();
    [...]   
    } 

为了检索页面的代码,我做了一个AsyncTask. 对于调试,我使用睡眠 5 秒。

ImageView rt_logo;

public HttpGetRequest(ImageView _rt_logo) {
    rt_logo = _rt_logo;
}

@Override
protected String doInBackground(URI... uris) {

HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(uris[0]);


[...]

SystemClock.sleep(5000);
getString = stringBuffer.toString();

return getString;
}

我的问题是,在黑色/蓝色渐变和徽标显示之前,我得到了 5 秒钟的白屏,我猜是在AsyncTask.

为什么应用启动时收不到?

谢谢。

4

3 回答 3

0

我找到了一种方法来执行 AsyncTask onCreate() 并且仍然拥有我的内容。

正如 Andy 所说,MainActivity 不能期望 AsyncTask 的值,否则它会在显示内容之前等待。因此,在 onCreate 中,将您的活动作为参数提供给 AsyncTask 并执行它。

HttpGetRequest httpGetRequest = new HttpGetRequest(MainActivity.this);

    try {
        URI uri = new URI("http://www.domain.com/live.html");
        URI[] uris = {uri};

        httpGetRequest.execute(uris);

    } catch (URISyntaxException e) {
        Log.e(TAG, "Wrong URI syntax : " + e.getMessage()); 
        e.printStackTrace();
    }

然后,在您的 AsyncTask 中,创建一个 onPostExecute 方法。在其中,完成 MainActivity 并调用另一个。如果您希望它对用户不可见,请在活动开始时禁用动画。

Activity activity;

public HttpGetRequest(Activity activity) {
    this.activity = activity;
}

public void onPostExecute(String response) {

    Bundle bundle = new Bundle();
    bundle.putString("response", response);

    Intent intent = new Intent(this.activity, LiveActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    intent.putExtras(bundle);

    this.activity.startActivity(intent);

}

向您的新活动发送 AsyncTask 响应,就是这样!

于 2013-10-27T09:02:08.437 回答
0

目前尚不清楚您到底想用 sleep() 做什么。但是,由于您在“AsyncTask”的 doInBackground 方法中提到了它,因此只有在 Async 任务启动后才会执行它。如果您希望在启动应用程序时有延迟,您可能应该在 AsyncTask 之外的 onCreate() 方法中编写延迟代码。

于 2013-10-26T20:47:00.003 回答
0

像 Siddharth 一样,我也对你正在尝试做的事情感到有点困惑。您所做的并不完全错误,这基本上是启动线程,等待 5 秒,然后从您的 Http 请求中获取信息。这不应该导致背景不出现。但我确实有一个怀疑;这一行:

response = httpGetRequest.execute(uris).get();

你期待一个结果。由于它是一个单独的线程,因此您可能不会得到您认为的响应。实际上它甚至可能是空的(在我看到所有代码之前我不会知道)。无论如何,我会检查一下,因为如果您正在做的事情可能会导致响应延迟。很高兴看到其余部分做了什么onCreate

于 2013-10-26T20:53:06.697 回答