【问题标题】:To use ProgressDialog till GridView gets loaded from webservice使用 ProgressDialog 直到从 web 服务加载 GridView
【发布时间】:2013-12-03 20:26:11
【问题描述】:

我正在从 Web 服务获取 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();
            }
        }

    }

请告诉我必须将哪些代码放置在确切的位置,每当我进行一些更改时,它要么显示没有效果,要么应用程序因某些问题而关闭。

谢谢,

哈哈。

【问题讨论】:

  • 你应该在 AsyncTask 中显示ProgressDialog。实现onPreExecute方法并在任务开始前初始化对话框。
  • 从应用用户的角度来看,通过 ProgressDialog 阻塞整个 GridView 是一个非常糟糕的设计。用户应该能够在其他部分仍在加载时查看/单击部分 GridView。考虑使用 AsyncTask.onProgressUpdate() 按需显示加载的图像,而不是阻塞整个 GridView 并最终在所有图像加载后显示它。

标签: android android-gridview


【解决方案1】:

尝试将来自服务器的所有渲染部分放入 doInBackground() 并在 onPostExecute() 中设置适配器。甚至在 onPreExecute() 中启动 progressdialog 并在 onPostExecute() 中将其关闭,但在 onCreate() 中没有。我想它会解决你的问题....

【讨论】:

  • 是的,我真的做到了,感谢您的帮助。
【解决方案2】:

这应该是您的内部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();

希望它能解决你的问题。

【讨论】:

  • 对不起兄弟,遇到致命异常:MAIN。
  • 代码螨有一些小问题。其他答案是合理的,但你的答案也很好,所以我投票赞成。休息你可以看到我发布的完整答案。
【解决方案3】:

我在这里给出我的问题的完整答案,以便它可以帮助其他人轻松完成......

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();
        }
    }

}   
}

我已经根据我的需要使用它,它只是为了帮助,完整的代码可能会给你带来问题。所以只是作为参考。

感谢和问候,

哈哈。

【讨论】:

    【解决方案4】:

    尝试使用此代码进行对话,否则代码似乎可以正常工作

    dialog= new ProgressDialog(this);
                    dialog.setMessage("Loading");
                    dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                    dialog.setCancelable(false);        
                    dialog.show();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 2013-09-22
      • 2013-06-21
      • 2015-09-18
      • 2016-04-03
      • 1970-01-01
      • 2014-03-10
      相关资源
      最近更新 更多