2011-06-26 6 views
2

インターネットからの応答を待たなければならない新しいアクティビティが開始されたときに進行状況ダイアログを追加しようとしています。現時点では、スクリーンは待っている間に黒くなります。誰がそれが働くために配置する必要があるかを知っていますか?android:接続を待っているときに進行状況ダイアログを表示します。

このprogressDialog:

ProgressDialog dialog = ProgressDialog.show(SearchActivity.this, "", "Loading. Please wait...", true); 
dialog.dismiss(); 

このoverlayActivityであるがItemizedOverlayを拡張:

@Override 
protected boolean onTap(int index) { 
    final OverlayItem item = (OverlayItem) items.get(index); 
    final Context mContext = context; 
    AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 
    builder.setTitle(item.getTitle()) 
    .setCancelable(true) 
    .setPositiveButton("View Details", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      Intent intent = new Intent(mContext, Profile.class); 
      intent.putExtra("id", item.getSnippet()); 
      mContext.startActivity(intent); 
     } 
    }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
    return true; 
} 

これはプロファイル活動である:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.profile); 
    Bundle extras = getIntent().getExtras(); 
    String id; 

    if (extras != null) { 
     id = extras.getString("id"); 

     String xml = XMLfunctions.getXMLFromBarId(id); // makes httpPost call 
     Document doc = XMLfunctions.XMLfromString(xml); 
     NodeList nodes = doc.getElementsByTagName("result"); 
     Element e = (Element)nodes.item(0); 

     // rest of profile created here 
    } 
} 

答えて

11

あなたは進行ダイアログを使用する必要があります。プロファイルアクティビティで進捗ダイアログを使用する必要があります。 次のコードを使用できます。

final ProgressDialog dialog = ProgressDialog.show(MyProfileActivity.this, "","Loading..Wait.." , true); 
dialog.show(); 
Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    public void run() { 
     //your code here 
       dialog.dismiss(); 
    } 
}, 3000); // 3000 milliseconds 
+0

'このハンドラが付いているスレッドで実行可能ファイルが実行されます。'これを忘れないでください。 – dazito

2

は、UIスレッドでネットワーク呼び出しを行います( "onCreate"を呼び出すスレッド)は悪い考えです。ネットワーク操作が完了するまでUIのリフレッシュを停止します。その代わり、そのようのonCreateに新しいスレッドを生成:

Thread networkThread = new Thread() { 
    public void run() { 

     String xml = XMLfunctions.getXMLFromBarId(id); // makes httpPost call 
     Document doc = XMLfunctions.XMLfromString(xml); 
     NodeList nodes = doc.getElementsByTagName("result"); 
     Element e = (Element)nodes.item(0); 

     .... 
    } 
} 
networkThread.start(); 

また、私は(スレッド内のコードが実行されると、あなたは、解任することができた)進行状況を表示するProgressDialogを使用してお勧めします。チュートリアル:http://developer.android.com/guide/topics/ui/dialogs.html

:あなたはUIスレッドへのスレッドからのメッセージを投稿するハンドラを使用する必要がありますので、あなたは、新しいスレッドからダイアログを閉じることができません。ここではそのためのチュートリアル:http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html

例:あなたのプロフィールのアクティビティクラスで 、これを追加します。

class ProfileActivity extends Activity { 
    class ProfileHandler extends Handler { 
     private ProfileActivity parent; 

     public ProfileHandler(ProfileActivity parent) { 
      this.parent = parent; 
     } 

     public void handleMessage(Message msg) { 
      parent.handleMessage(msg); 
     } 
    } 

    private ProfileHandler handler; 

    public void onCreate(Bundle savedInstanceState) { 
     handler = new ProfileHandler(this); 

     Thread networkThread = new Thread() { 
      public void run() { 

      String xml = XMLfunctions.getXMLFromBarId(id); // makes httpPost call 
      Document doc = XMLfunctions.XMLfromString(xml); 
      NodeList nodes = doc.getElementsByTagName("result"); 
      Element e = (Element)nodes.item(0); 

      .... 

      ProfileActivity.this.handler.sendEmptyMessage(0); 
      } 
     } 
     networkThread.start(); 
    } 

    public void handleMessage(msg) { 
     switch(msg.what) { 
     case 0: 
      // Update UI here 
      break; 
     } 
    } 
} 
+0

ありがとうございます。私はこの方法を試しましたが、残念ながらそれは動作しませんでした。アクティビティが実行され、ページが表示されますが、データは表示されません。私は問題を見つけることができるかどうかを調べるためにそれをさらに調べます。多くのありがとう:) – Paul

+0

データを表示しようとしている場所を教えてください。上記のように、別のスレッドでUIを更新しようとすると失敗します。ハンドラを使用してUIスレッドにメッセージを送り返す必要があります。 – sparkymat

+0

UIはスレッド内で、要素e = ...の直後に更新されます。スレッド外で起こっているのは、XML関数からデータを引き出すXML関数メソッドです。 – Paul

関連する問題