gpt4 book ai didi

java - 显示闪屏时运行代码

转载 作者:太空宇宙 更新时间:2023-11-04 12:17:02 25 4
gpt4 key购买 nike

我有一个应用程序,可以从互联网上获取时间。对它进行一些数学计算,然后完成后开始另一个 Activity 。

这是我的闪屏 Activity 中的代码

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 线程,导致我在启动屏幕布局中设置的 Logo 在匹配器完成之前不会显示。我该如何让匹配器在后台运行,这样 UI 就不会延迟?

感谢您的帮助

最佳答案

您遇到的问题是,只要 Activity 处于 Activity 状态,AsyncTask 就会运行。要将其与 Activity 分离,您有几个选择:

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

  2. AsyncTask 放入您的 Application 类中。这并不是一个好主意,因为这不是该类(class)的目的,但它会起作用。

  3. 在闪屏中,仅进行调用来获取数据,然后将其以 Intent 形式传递给下一个 Activity - 并在该 Activity 中运行 AsyncTask 来进行模式匹配。这会中断处理,但可能会导致用户在两个屏幕上等待这些调用。尽管如此,最好还是看到应用程序“做某事”,而不是等待很长时间。

还有其他方法可以处理这个问题,但这些可能是最好的方法,而且不会变得太复杂。

关于java - 显示闪屏时运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39284255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com