我有一个启动画面,我正在尝试运行一些AsyncTasks。在显示启动画面之前,AsyncTasks似乎正在运行。我需要启动屏幕(徽标和每个进程显示不同的消息)并开始运行asynctasks。我只是在吹码中使用书籍作为我所拥有的一个例子:
SplashScreen.java:
// Splash screen timer
private static int SPLASH_TIME_OUT = 3000;
TextView statusMessage;
BookClubDB bookClubDB = new BookClubDB(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash_screen);
statusMessage = (TextView) findViewById(R.id.statusMessage);
statusMessage.setText("Checking For Connection");
if(isNetworkAvailable()){
statusMessage.setText("Connection Found");
String appUpdateDate = null;
appUpdateDate = lastUpdate();
update1(appUpdateDate);
update2(appUpdateDate);
update3(appUpdateDate);
update4(appUpdateDate);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
endSplash();
}
}, SPLASH_TIME_OUT);
}
else {
statusMessage.setText("No Connection Found");
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
endSplash();
}
}, SPLASH_TIME_OUT);
}
}
public void endSplash(){
Intent i = new Intent(SplashScreen.this, MainActivity.class);
startActivity(i);
// close this activity
finish();
}
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
private String lastUpdate(){
String updateDate = null;
updateDate = bookClubDB.getUpdateDate();
return updateDate;
}
private void update1(String appUpdateDate){
statusMessage.setText("Updating Regions");
bookClubDB.getAPI1(appUpdateDate);
}
private void update2(String appUpdateDate){
statusMessage.setText("Updating Vehicles");
bookClubDB.getAPI2(appUpdateDate);
}
private void update3(String appUpdateDate){
statusMessage.setText("Updating Products");
bookClubDB.getAPI3(appUpdateDate);
}
private void update4(String appUpdateDate){
statusMessage.setText("Updating Documents, Images, and Video");
bookClubDB.getAPI4(appUpdateDate);
}
被调用的函数(updated1 ... 4)在名为BookClubDB.java的文件中调用另一个函数(getAPI1 ... 4)。第二组是在名为JASONParser.java的文件中运行asynctasts的。函数和解析器工作。只有asynctasks在启动画面显示之前运行。
我希望弹出屏幕弹出“检查连接” - > “找到连接” - >每个函数在运行时都会更新。
JSONParser.java是一个简单的json解析器,它将json结果返回给BookClubDB.java:
JSONObject output = new JSONParser().execute(new String[] {bookClubURL,consumerKey,sharedSecret}).get();
该函数接受json,将其转换为jsonArray,然后用它填充数据库。一切都按需要运行,只有asynctasks运行得太快。
如何在asynctask线程之前启动启动画面的线程?我看过其他SO答案,但他们从来没有真正回答过我。
答案 0 :(得分:0)
您正在活动的OnCreate方法中运行所有代码。此时UI尚未显示。
查看Android文档中的活动生命周期,然后根据该文档进行重写。
答案 1 :(得分:0)
我猜这种情况正在发生,因为当活动仍在创建时,你正在活动的onCreate中触发asynctasks。 如果我理解正确,您只希望在显示启动画面后触发它们。
onResume
是一个很好的回调。
此外,请注意您同时触发所有updatexx方法,并且每次都会覆盖状态消息。
答案 2 :(得分:0)
可能是因为您在主线程上设置了消息文本。
如果在主线程上运行一些更改太快,则不必执行它们,也可能导致UI滞后。
基本上你的应用就是这样:
- >的OnCreate
- > setText(“检查连接”)
- >的setText( “OnConnectionFound”)
- > setText(“更新区域”)
- >安排新的AsyncTask来更新区域
- > setText(“正在更新车辆”)
- >安排新的AsyncTask来更新车辆
..... update3,4 ......
现在只有系统才开始执行异步任务。 (它不一定非常严格,特别是在多核处理器上。有可能f.e.region asyncTask在update3 setText之前启动,但它确实在之前没有完成) 但是有一件事你需要意识到:所有这些调用都非常快,可能不会超过几毫秒。并且UI不经常更新(也不会注意到它)。
因此文本更新太快/根本不更新。
你提到你正在使用AsyncTask,这很好。您可能只需将setText调用放入onPreExecute / onPostExecute / onProgressChanged方法(基于您希望更改文本的时间),它将正常工作。这些方法旨在在适当的时间在UI线程上调用,因此确保将呈现所有UI操作:)