我有一个应用程序,并从互联网上获取时间。是否有一些数学,然后在那之后就开始了另一项活动。
以下是我的启动画面活动中的代码
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不会延迟?
感谢您的帮助
答案 0 :(得分:0)
您遇到的问题是AsyncTask
只要Activity
还活着就会运行。要将它与Activity
分开,您有几个选项:
最好的办法是将Intent
发送给处理此问题的IntentService
。您需要保留结果(例如在SharedPrefs
中)和/或创建活页夹/回调或使用其他方法来获取数据。
将AsyncTask
放入Application
课程。这不是一个好主意,因为它不是该类的目的,但它会起作用。
在启动画面中,只调用获取数据,然后将意图传递给下一个Activity
- 并在Activity
运行AsyncTask
进行模式匹配。这会中断处理,但可能会导致用户在两个屏幕上等待这些调用。不过,看到应用程序“做某事”而不是等待很长时间会更好。
还有其他方法可以解决这个问题,但这些方法可能是最好的方法而不会过于复杂。