Android: отображение диалога прогресса при ожидании подключения - PullRequest
2 голосов
/ 26 июня 2011

Я пытаюсь добавить диалоговое окно прогресса при запуске нового действия, которое должно ждать ответа из Интернета. На данный момент экран просто становится черным, пока он ждет. Кто-нибудь знает, где его нужно разместить для работы?

этот прогрессДиалог:

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

это в оверлее, расширяет активность 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 
    }
}

Ответы [ 2 ]

11 голосов
/ 26 июня 2011

Вы должны использовать диалог прогресса.Диалог хода должен использоваться в профиле активности.Вы можете использовать следующий код:

    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
2 голосов
/ 26 июня 2011

Выполнение сетевых вызовов в потоке пользовательского интерфейса (потоке, который вызывает "onCreate") - плохая идея.Он остановит обновление пользовательского интерфейса до завершения работы сети.Вместо этого создайте новый поток в 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

Примечание : вы не можете закрыть диалоговое окно из новой цепочки, поэтому вам придется использовать обработчик для отправки сообщения из цепочки в ветку пользовательского интерфейса.Вот учебник для этого: 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;
        }
    }
}
...