簡體   English   中英

進度對話框-AsyncTask

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM