[英]Progress dialog - AsyncTask
我正在將ActionBar Tablistener與ViewPager一起使用,我有三個片段。
啟動時,我的應用程序正在從中填充片段列表視圖的位置下載XML文件數據源。
啟動應用程序時,如何在AsyncTask中下載XML文件時(互聯網連接速度較慢時)添加簡單的進度對話框,以便在下載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;
}
}
}
不要在Activity.onCreate()
方法中調用SystemClock.sleep()
,您將完全阻止UI並可能使應用程序崩潰。 您需要為onPostExecute
提供AsyncTask
方法實現。 您的onPostExecute
將在UI線程上運行,因此它可以調用Activity
的方法,該方法將關閉對話框並更新適配器或其他任何方法。 考慮使用AsyncTask
支持的加載器,因為它可以生命周期感知。 如果不這樣做,則需要確保您的Activity
正確處理了AsyncTask
的生命周期清理(即,調用AsyncTask.cancel()
。
AsyncTask有3個主要的基本覆蓋方法。
1)onPreExecute
2)doInBackGround
3)onPostExecute
在AsyncTask開始運行時onPreExcute會獲取調用。在doInBackGround之前。因此您可以在此處顯示進度對話框。
doInBackground:您可以在此處處理您的服務或其他任何長過程。 例如致電webserivice。 在UI線程上不起作用。
onPostExecute:它在doInbackGround完成后被調用。.因此您可以在這里隱藏進度條。 它在UI線程上工作。
例如
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..
}
}
就我個人而言,我將使用一個在asynctask的后執行時調用的接口,然后在onpreexecute中啟動一個進度對話框,然后在您在后執行中調用接口類之前關閉它,從您的主要任務中執行此接口並運行下一個代碼事件觸發時。
例如
Main Class
public void taskdone();
Async Task
OnPostExecute
MyInterface.taskdone();
Interface
public taskdone();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.