在启动splashscreen时运行代码

时间:2016-09-02 04:19:52

标签: java android android-studio background task

我有一个应用程序,并从互联网上获取时间。是否有一些数学,然后在那之后就开始了另一项活动。

以下是我的启动画面活动中的代码

package com.firefluxentertainment.retroclicker;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutionException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SplashActivity extends AppCompatActivity {

    long endTime;
    long timeDelta;
    Long endTimeMaths;
    long timeStamp;

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

        load();


        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

        DownloadTask task = new DownloadTask();
        String result = null;

        try {

            result = task.execute("http://www.currenttimestamp.com/").get();

            Pattern p = Pattern.compile("current_time = (.*?);");
            Matcher m = p.matcher(result);
            m.find();
            String unixTime = (m.group(1));
            timeStamp = Integer.parseInt(unixTime);
            endTimeMaths = endTime/1000;

        } catch (InterruptedException e) {

            e.printStackTrace();

        } catch (ExecutionException e) {

            e.printStackTrace();
            Toast.makeText(SplashActivity.this, "you aint got no internet man", Toast.LENGTH_SHORT).show();

        }

        timeDelta = timeStamp-endTimeMaths;

        Log.i("TimeDelta", timeDelta+"");

    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }

    @Override
    public void onResume() {
        super.onResume();

        new CountDownTimer(2000, 1000) {

            public void onTick(long millisUntilFinished) {
            }

            public void onFinish() {
                Intent i = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(i);
            }

        }.start();
    }

    public class DownloadTask extends AsyncTask<String, Void, String> {


        @Override
        protected String doInBackground(String... urls) {

            String result = "";
            URL url;
            HttpURLConnection urlConnection = null;

            try {

                url = new URL(urls[0]);

                urlConnection = (HttpURLConnection) url.openConnection();

                InputStream in = urlConnection.getInputStream();

                InputStreamReader reader = new InputStreamReader(in);

                int data = reader.read();

                while (data != -1) {

                    char current = (char) data;

                    result += current;

                    data = reader.read();
                }

                return result;

            } catch (Exception e) {

                e.printStackTrace();

            }

            return null;
        }
    }

    void save(){
        SharedPreferences pref = this.getSharedPreferences("TEST_PREFS", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();

        editor.putLong("endTime", endTime);
        editor.commit();
    }

    void load() {
        SharedPreferences pref = this.getSharedPreferences("TEST_PREFS", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();

        endTime = pref.getLong("endTime", System.currentTimeMillis()/1000);
        editor.apply();
    }

}

我的网页内容包含在后台下载的时间,然后我在其上运行模式和匹配器。问题是大部分时间都在浪费运行匹配器而不是下载网页。由于匹配器在主线程上运行,因此它会延迟UI线程,导致我在启动画面布局中设置的徽标在匹配器完成之前不会显示。我如何才能使匹配器在后台运行以便UI不会延迟?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您遇到的问题是AsyncTask只要Activity还活着就会运行。要将它与Activity分开,您有几个选项:

  1. 最好的办法是将Intent发送给处理此问题的IntentService。您需要保留结果(例如在SharedPrefs中)和/或创建活页夹/回调或使用其他方法来获取数据。

  2. AsyncTask放入Application课程。这不是一个好主意,因为它不是该类的目的,但它会起作用。

  3. 在启动画面中,只调用获取数据,然后将意图传递给下一个Activity - 并在Activity运行AsyncTask进行模式匹配。这会中断处理,但可能会导致用户在两个屏幕上等待这些调用。不过,看到应用程序“做某事”而不是等待很长时间会更好。

  4. 还有其他方法可以解决这个问题,但这些方法可能是最好的方法而不会过于复杂。