2012-02-23 4 views
0

WebサービスからGridViewのイメージとテキストをフェッチしているので、GridViewを表示するのに時間がかかります。グリッドが完全にロードされるまでProgressDialogを表示したい。私が今までやったことは以下の通りです:GridViewがWebサービスからロードされるまでProgressDialogを使用するには

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

    } 

私はいくつかの変更を行うたびに、どちらかは効果を示さないか、アプリケーションはいくつかの問題が原因で閉じ、どのような正確な位置に配置されるようにしているものをコードすることを教えてください。

ありがとう、

ハプス。

+0

AsyncTaskに 'ProgressDialog'を表示してください。タスクの開始前に 'onPreExecute'メソッドを実装し、ダイアログを初期化します。 –

+0

アプリユーザーの観点から見ると、ProgressDialogでGridView全体をブロックすることは非常に悪い設計です。ユーザーは、他の部品がまだロードされている間にGridViewの一部を表示/クリックすることができます。 AsyncTask.onProgressUpdate()を使用して、GridView全体をブロックする代わりに、ロードされたイメージをオンデマンドで表示し、最終的にすべてのイメージがロードされたら表示することを検討してください。 – yorkw

答えて

5

サーバからすべてのレンダリング部分をdoInBackground()に配置し、onPostExecute()にアダプタを設定してください。また、onPreExecute()でprogressdialogを開始し、onPostExecute()ではそれを終了しますが、onCreate()では終了しません。私はこのコードを他のコードで

+0

私は本当にそれを可能にしました、助けてくれてありがとう。 – Harpreet

2

トライダイアログでは、必要があるとして、これはあなたの内AsyncTaskクラス、変更パラメータである必要があり

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

このコンセプトもうまくいきます。これも使用できます。 – Harpreet

4

ワーキングようだ....それはウルの問題を解決すると思います。

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

私はそれはあなたの問題を解決したいと考えています。

+0

申し訳ありませんが、致命的な例外:MAINを持っています。 – Harpreet

+0

助けてくれてありがとう。 – Harpreet

+0

@Haps何が問題なの? –

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

} 
} 

を完全な答えを与えています助けてください、完全なコードはあなたに問題を与えるかもしれません。だからちょうど参照としてそれを取る。

おかげ&よろしく、

HAPS。

関連する問題