Использовать ProgressDialog до загрузки GridView из веб-сервиса
Я извлекаю изображение и текст для GridView из веб-службы, поэтому для отображения GridView требуется некоторое время. Я хочу показать ProgressDialog до полной загрузки Grid. То, что я сделал до сих пор, как показано ниже:
public class PCGridMain extends Activity
{
WebService web = new WebService();
private GridView gridView;
ProgressDialog dialog;
Bitmap icon;
int i, total;
URL url= null;
List<GridItem> list;
@Override
public void onCreate(Bundle grid)
{
super.onCreate(grid);
dialog = ProgressDialog.show(PCGridMain.this, "Loading...", "Loading App, Please wait.", true);
DialogWork dWork = new DialogWork();
dWork.execute();
setContentView(R.layout.main);
gridView = (GridView)findViewById(R.id.gridView1);
web.WebService1();
total = web.totalService;
list = new ArrayList<GridItem>();
for(i=0; i<total; i++)
{
Log.v("Try Block", "See what we get:-");
try
{
Log.v("GridMain", "try url" + Integer.toString(i));
url = new URL(web.arr[i][2]);
}
catch (MalformedURLException e)
{
Log.v("GridMain", "catch MalformedURLException" + Integer.toString(i));
e.printStackTrace();
}
try
{
Log.v("GridMain", "try BitmapFactory" + Integer.toString(i));
icon = BitmapFactory.decodeStream(url.openConnection().getInputStream());
}
catch (IOException e)
{
Log.v("GridMain", "catch IOException" + Integer.toString(i));
e.printStackTrace();
}
list.add(new GridItem(icon, web.arr[i][1])); // Adding Icon & LAbel
}
gridView.setAdapter(new GridAdapter(this, list));
gridView.setOnItemClickListener(Itemlistener);
}
private OnItemClickListener Itemlistener = new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position, long id)
{
ViewHolder holder = (ViewHolder)view.getTag();
if(holder == null)
{
return;
}
Toast.makeText(PCGridMain.this, holder.label.getText(), Toast.LENGTH_SHORT).show();
Log.v("GridMain", "Intent Creation");
Intent intent = new Intent(view.getContext(), ShowService.class); Log.v("GridMain", "Intent Created");
intent.putExtra("ServiceId", web.arr[position][0]); Log.v("GridMain", "ValueAdded Sid");
intent.putExtra("SName", holder.label.getText()); Log.v("GridMain", "ValueAdded SName");
startActivity(intent);
}
};
class DialogWork extends AsyncTask<URL, Integer, Long>
{
protected Long doInBackground(URL... params)
{
try
{
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
protected void onProgressUpdate(Integer... progress)
{
}
protected void onPostExecute(Long result)
{
try
{
//setContentView(R.layout.main);
//gridView.setAdapter(new GridAdapter(PCGridMain.this, list));
dialog.dismiss();
}
catch (Exception e)
{
e.printStackTrace();
dialog.dismiss();
}
}
}
Скажите, пожалуйста, какой код должен быть размещен в каком именно месте, когда я делаю какие-либо изменения, он либо не показывает никакого эффекта, либо приложение закрывается из-за какой-то проблемы.
Спасибо,
Haps.
4 ответа
Попробуйте поместить все детали рендеринга с сервера в doInBackground() и установить адаптер в onPostExecute() . И даже запустите progressdialog в onPreExecute() в и отклоните его в onPostExecute (), но не в onCreate(). Я думаю, что это решит вашу проблему....
Это должно быть вашим внутренним AsyncTask
класс, измените параметры, как вам нужно.
private class yourTask extends AsyncTask<Void, Void, ArrayList> {
String message;
ProgressDialog dialog;
public refreshTask(String message) {
this.message = message;
this.dialog = new ProgressDialog(PCGridMain.this);
}
@Override
protected void onPreExecute() {
dialog.setMessage(message);
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
}
@Override
protected ArrayList doInBackground(String... params) {
// Some work
}
@Override
protected void onPostExecute(ArrayList result) {
if(dialog.isShowing())
dialog.dismiss();
}
}
Таким образом, вы можете назвать этот класс как:
new yourTask('Dialog message').execute();
Я надеюсь, что это решит вашу проблему.
Здесь я даю полный ответ на мой вопрос, чтобы он мог помочь другим сделать это легко...
public class PCGridMain extends Activity
{
WebService web = new WebService();
private GridView gridView;
ProgressDialog dialog;
Bitmap icon;
int i, total;
URL url= null;
List<GridItem> list;
@Override
public void onCreate(Bundle grid)
{
super.onCreate(grid);
Log.v("GridMain", "setContent");
setContentView(R.layout.main);
gridView = (GridView)findViewById(R.id.gridView1);
DialogWork dWork = new DialogWork();
dWork.execute();
}
private void ForLoop()
{
for(i=0; i<total; i++)
{
Log.v("Try Block", "See what we get:-");
try
{
Log.v("GridMain", "try url" + Integer.toString(i));
url = new URL(web.arr[i][2]);
}
catch (MalformedURLException e)
{
Log.v("GridMain", "catch MalformedURLException" + Integer.toString(i));
e.printStackTrace();
}
try
{
Log.v("GridMain", "try BitmapFactory" + Integer.toString(i));
icon = BitmapFactory.decodeStream(url.openConnection().getInputStream());
}
catch (IOException e)
{
Log.v("GridMain", "catch IOException" + Integer.toString(i));
e.printStackTrace();
}
list.add(new GridItem(icon, web.arr[i][1])); // Adding Icon & LAbel
}
}
private OnItemClickListener Itemlistener = new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position, long id)
{
ViewHolder holder = (ViewHolder)view.getTag();
if(holder == null)
{
return;
}
Toast.makeText(PCGridMain.this, holder.label.getText(), Toast.LENGTH_SHORT).show();
Log.v("GridMain", "Intent Creation");
Intent intent = new Intent(view.getContext(), ShowService.class); Log.v("GridMain", "Intent Created");
intent.putExtra("ServiceId", web.arr[position][0]); Log.v("GridMain", "ValueAdded Sid");
intent.putExtra("SName", holder.label.getText()); Log.v("GridMain", "ValueAdded SName");
startActivity(intent);
}
};
class DialogWork extends AsyncTask<URL, Integer, String>
{
protected void onPreExecute()
{
Log.v("GridMain", "PreExecute()");
dialog = ProgressDialog.show(PCGridMain.this, "Loading...", "Loading App, Please wait.", false, true);
}
protected Long doInBackground(URL... params)
{
String response = "";
try
{
Log.v("GridMain", "doInBackground");
response = web.WebService1();
total = web.totalService;
}
catch (InterruptedException e)
{
Log.v("GridMain", "InterruptedException");
e.printStackTrace();
}
return response;
}
protected void onPostExecute(String result)
{
try
{
// Response is in RESULT_VAR
Log.v("GridMain", "onPostExecute");
list = new ArrayList<GridItem>();
ForLoop();
gridView.setAdapter(new GridAdapter(PCGridMain.this, list));
gridView.setOnItemClickListener(Itemlistener);
dialog.dismiss();
}
catch (Exception e)
{
Log.v("GridMain", "Exception e");
e.printStackTrace();
dialog.dismiss();
}
}
}
}
Я использовал его в соответствии с моими потребностями, просто для справки, полный код может доставить вам проблемы. Так что просто примите это как ссылку.
С уважением,
Haps.
Попробуйте диалог с этим кодом, иначе код работает
dialog= new ProgressDialog(this);
dialog.setMessage("Loading");
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setCancelable(false);
dialog.show();