进度对话框 - AsyncTask

时间:2014-08-02 18:17:05

标签: android xml android-fragments android-asynctask

我在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;
        } 

    }   

}

3 个答案:

答案 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();