Как обновить ProgressBar относительно загруженных данных при загрузке текстовых данных из Интернета, используя Asynctask в Android

Я хочу показать прогрессбар по загруженным данным из сети. Должен ли я создавать динамически или ссылаться по Id, создавая его в xml. Я немного запутался. Вот мой код Не могли бы вы сказать мне, как?

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 ответа

Есть много способов. Один из них - определить 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();

Затем вы можете обновить прогресс, переопределив updateProgress() в AsyncTask и вызвать pDialog.setProgress();

Использование динамически создаваемого индикатора выполнения или ссылки на него по идентификатору - все в порядке.

Использование ссылки из XML позволяет вам лучше контролировать внешний вид индикаторов выполнения, так как вы бы разработали их по отдельности для ваших нужд (например, внешний вид, место его появления и т. Д.). Но если это не так, вы можете использовать динамически созданный, как и в вашем текущем коде.

Другие вопросы по тегам