我在ViewPager中使用ActionBar Tablistener,我有三个片段。
在启动时,我的应用程序正在下载我的XML文件数据源,我的ListView片段正在填充。
当我启动应用程序时,如何在AsyncTask中下载我的XML文件(当Internet连接速度慢时)时添加简单的进度对话框,以便在下载xml后运行我的Activity?
目前我正在使用SystemClock.sleep(2760);
,因此有足够的时间以正常的连接速度下载...
我的主要活动:
public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
TextView mSearchText;
ViewPager viewPager=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.pager);
final ActionBar actionBar=getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(false);
addTabs(actionBar);
viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i2) {
Log.d("VIVZ","onPageScrolled "+i+" "+v+" "+i2);
}
@Override
public void onPageSelected(int i) {
actionBar.setSelectedNavigationItem(i);
Log.d("VIVZ","onPageSelected "+i);
}
@Override
public void onPageScrollStateChanged(int i) {
if(i==ViewPager.SCROLL_STATE_IDLE)
Log.d("VIVZ","onPageScrollStateChanged scroll state idle "+i);
if(i==ViewPager.SCROLL_STATE_DRAGGING)
Log.d("VIVZ","onPageScrollStateChanged scroll state dragging "+i);
if(i==ViewPager.SCROLL_STATE_SETTLING)
Log.d("VIVZ","onPageScrollStateChanged scroll state settling "+i);
}
});
if(isNetworkAvailable()){
Log.i("mobAppModel", "starting download Task");
AppDownloadTask download = new AppDownloadTask();
download.execute();
SystemClock.sleep(2760);
}
}
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
private class AppDownloadTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... arg0) {
//Download the file
try {
Downloader.DownloadFromUrl("https://URL_on_kategorijeXML.xml", openFileOutput("XMLsource.xml", Context.MODE_PRIVATE));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
}
答案 0 :(得分:1)
请勿在{{1}}方法中调用SystemClock.sleep()
,否则您将完全阻止用户界面,并可能导致应用崩溃。您需要为Activity.onCreate()
提供AsyncTask
方法实施。您的onPostExecute
将在UI线程上运行,因此它可以调用onPostExecute
中的方法,该方法会解除您的对话框并更新您的适配器或其他任何内容。考虑使用由Activity
支持的加载器,因为它将具有生命周期意识。如果您不这样做,则需要确保AsyncTask
正确处理Activity
的生命周期清理(即致电AsyncTask
。
答案 1 :(得分:1)
AsyncTask有3个主要的基本覆盖方法..
1)onPreExecute
2)doInBackGround
3)onPostExecute
onPreExcute在AsyncTask开始运行时获取调用。在doInBackGround之前..所以在这里你可以显示你的进度对话框..
doInBackground:您可以在这里处理您的服务或任何其他漫长的过程。例如打电话给webserivice。它在UI线程上不起作用。
onPostExecute:在doInbackGround完成后调用它。所以在这里你可以隐藏进度条。它在UI线程上工作。
e.g。
private class DownloadFilesTask extends AsyncTask<Void,Void,Void> {
protected void onPreExecute() {
showDialog();
}
protected Void doInBackground(Void... args) {
//Download the file
try {
Downloader.DownloadFromUrl("https://URL_on_kategorijeXML.xml", openFileOutput("XMLsource.xml", Context.MODE_PRIVATE));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Void result) {
//dismiss dialog..
}
}
答案 2 :(得分:0)
我个人会使用一个在你的asynctask的postexecute上调用的接口,然后在onpreexecute中启动一个进度对话框,然后在你的post执行上调用你的接口类之前关闭它,从你的主任务实现这个并运行事件被触发时的下一个代码。
例如
Main Class
public void taskdone();
Async Task
OnPostExecute
MyInterface.taskdone();
Interface
public taskdone();