【问题标题】:android: displaying progress dialog when waiting for connectionandroid:等待连接时显示进度对话框
【发布时间】:2011-06-26 10:45:35
【问题描述】:

我正在尝试在启动必须等待来自 Internet 的响应的新活动时添加进度对话框。目前屏幕只是在等待时变黑。有人知道它需要放在哪里工作吗?

这个进度对话框:

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 
    }
}

【问题讨论】:

    标签: android loading http-post progressdialog


    【解决方案1】:

    您应该使用进度对话框。进度对话框应在 Profile 活动中使用。 您可以使用以下代码:

        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
    

    【讨论】:

    • The runnable will be run on the thread to which this handler is attached. 不要忘记这一点。
    【解决方案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;
            }
        }
    }
    

    【讨论】:

    • 感谢您的建议。我确实尝试过这种方法,但不幸的是它没有用。活动运行并显示页面,但没有显示任何数据。我会更多地研究它,看看我是否能找到问题。非常感谢:)
    • 你能告诉我你试图在哪里显示数据吗?就像我提到的,任何在不同线程中更新 UI 的尝试都会失败。您必须使用处理程序将消息发送回 UI 线程。
    • UI 在线程内更新,就在“Element e = ...”之后。线程外发生的所有事情都是 XMLfunctions 方法,它们从 XML 提要中提取数据。
    • 这就是我提到的。您无法从我们创建的新线程 (networkThread) 更新 UI。您将必须执行网络操作,并在 networkThread 中读取项目,然后发回一条消息,该消息由您需要在 onCreate()(UI 线程)中初始化的 Handler 类处理。
    • 我一直试图让它工作一个多小时,但没有运气。即使是他说的教程也很难解释,而且它似乎不适用于我的应用程序。我想我会留下线程。还是谢谢。
    猜你喜欢
    • 2013-07-14
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    相关资源
    最近更新 更多