如何在Android中使用Asynctask从Web下载文本数据时更新ProgressBar的下载数据

时间:2015-03-01 08:06:16

标签: android android-asynctask android-progressbar

我想显示进度条,以便从网上下载数据。我是否必须通过在xml中创建它来动态创建或必须通过Id引用。我有点困惑。这是我的代码。你能告诉我怎么样吗?

package com.example.telugumovies;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Toast;

public class MainActivity extends ListActivity {
String category ="";
String[] cat = {"Upcoming","Telugu"};
private List<String> categories ;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    categories = new ArrayList<String>();
    int i=0;
    for(i=0;i<2;i++)
    {
        categories.add(cat[i]+" Movies");
    }
    ArrayAdapter<String> myAdapter = new ArrayAdapter <String>(this, 
            R.layout.listview_rowlayout, R.id.tv, categories);

     // assign the list adapter
     setListAdapter(myAdapter);
}
 // when an item of the list is clicked
@Override
protected void onListItemClick(ListView list, View view, int position, long id) {
    super.onListItemClick(list, view, position, id);
    Bundle giveCategory = new Bundle();
    if(position == 0)
    {
        try {
            new GetData().execute();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
        }
    }
    else if(position == 1)
    {
        giveCategory.putString("cate", cat[position]);
        Intent a = new Intent(MainActivity.this,Show_Years.class);
        a.putExtras(giveCategory);
        startActivity(a);   

    }
    else
    {
        Toast.makeText(getApplicationContext(), "Sorry This option is not Available for Now ",
               Toast.LENGTH_SHORT).show();
    }
    //String selectedItem = (String) getListView().getItemAtPosition(position);


}

class GetData extends AsyncTask<String,Integer,String>
{
    ProgressBar pb ;
    protected void onPreExecute()
    {
        pb = new ProgressBar(MainActivity.this);
        pb.setVisibility(View.VISIBLE);
    }
    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        String alldata = "";
        int flag=1;
        String data = "";
          URL url = null;
          int i=0,j=0,count=0,c=0;
          URLConnection con = null;
          InputStream is = null;
          String line = null;
        try
        {
            url = new URL("http://www.filmibeat.com/telugu/upcoming-movies.html");
            con = url.openConnection();
            is = con.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while ((line = br.readLine()) != null) {
               //System.out.println(line);
                alldata = "";
                flag=0;
                if(line.contains("<h3"))
                {j=0;
                flag=1;
                    for(i=0;i<line.length();i++)
                {
                    if(line.charAt(i)=='<')
                    {
                        j=1;
                    }
                    else if(j==1 && line.charAt(i)=='>')
                    {
                        j=0;
                    }
                    else if(j==0)
                    {
                        alldata = alldata + (line.charAt(i));
                    }
                }
                }
                data=data+alldata;
                if(flag==1)
                {
                data=data+"$";
                }

        }
            System.out.println(data);
            return data;
        }
            catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
            return data;
        }
        }
    protected void onPostExecute(String someting)
    {
        Bundle givedata = new Bundle();
        givedata.putString("moviedata",someting);
        Intent a = new Intent(MainActivity.this,Show_upcomingmovies.class);
        a.putExtras(givedata);
        pb.setVisibility(View.INVISIBLE);
        startActivity(a);
    }
    }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

2 个答案:

答案 0 :(得分:0)

使用动态创建的进度条或从ID引用它都很好。

使用XML中的引用可以让您对进度条外观有更多的控制,因为您可以根据需要(如外观,必须出现的位置等)设计它。但如果不是这种情况,您也可以像在当前代码中那样使用动态创建的。

答案 1 :(得分:0)

有很多方法。一种是将ProgressDiaolog定义为AsyncTask中的一个字段,然后将其添加到onPreExecuted():

pDialog = new ProgressDialog(this);
pDialog.setMessage("some downloading massage");
pDialog.setIndeterminate(false);
pDialog.setMax(100); //you can adjust this
pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pDialog.setCancelable(false);
pDialog.show();

然后您可以通过覆盖AsyncTask中的updateProgress()来更新进度并调用pDialog.setProgress();