나는 인터넷에서 나가는 앱을 가지고있다. 그 위에 몇 가지 수학이 있고 그 후에 그것은 또 다른 활동을 시작합니다. 여기 스플래시 화면이 표시되는 동안 코드 실행
내가 백그라운드에서 시간 다운로드가 포함 된 웹 페이지의 콘텐츠를하고 난 그것에 패턴 매처를 실행 나의되는 SplashScreen 활동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();
}
}
의 코드입니다. 문제는 대부분 웹 페이지를 다운로드하는 대신 matcher를 실행하는 데 낭비되고 있다는 것입니다. matcher가 주 스레드에서 실행 중이기 때문에 UI 스레딩이 지연되어서 splashscreen 레이아웃에서 설정 한 로고가 정규 표현자가 완성 될 때까지 표시되지 않습니다. matcher가 백그라운드에서 실행되어 UI가 지연되지 않도록하려면 어떻게해야합니까?
당신의 도움이
'task.execute'에서'.get()'을 제거하고'onPostExecute' 메서드 내에서'Pattern matching'을 모두 수행하십시오. –
@ ρяσѕρєяK .get()은 그것을 일치시킬 수 있도록 문자열로 변환합니다. .get을 제거하면 정규식에 의해 인덱싱 할 수없는 임의의 비동기 변수 유형이 전송됩니다. –