【问题标题】:show toast or progressbar on alertDialog item selected在选择的 alertDialog 项目上显示 toast 或进度条
【发布时间】:2013-06-12 13:49:03
【问题描述】:

我有一个包含一些项目的 alertDialog。 当一个项目被选中时,会有一些 Web 服务调用 只有当它们完成时,对话框才会关闭。 我想让用户知道他/她要等待。

我尝试过使用进度条和 Toast。 在 Toast 版本中,如果我只显示 Toast, 它确实显示 - 但仅在对话框关闭之后。

我还尝试在另一个线程上运行 Toast,这导致应用程序崩溃。

下面是一些代码示例:

private void chooseFromClosestSamplePoints(final ArrayList<Place> places) {     
        if (null != places) {
            final String[] items = new String[places.size()];
            for (int i = 0; i < places.size(); i++) {
                Place place = places.get(i);
                String displayText = place.mfactoryName + "," + place.msamplePointName;
                items[i] = displayText;
            }


                    AlertDialog.Builder builder = new AlertDialog.Builder(
                            Main.this);
                    builder.setTitle(R.string.select_sample_point);
                    builder.setItems(items,
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                        int which) {    
                                    Place place = places.get(which);                                    
                                    Toast toast = Toast.makeText(getApplicationContext(), "אנא המתן", Toast.LENGTH_LONG);
                                    toast.show();
                                    boolean res = selectPlace(place); //this is the long running WS call
                                    if(!res)
                                    {
                                      mStartButton.setEnabled(false);
                                      showAlert("שגיאה","אנא הגדר מחדש עיר מפעל ונקודת דיגום", false);
                                    }
                                }
                            });
                    builder.show();
                }           
    }

编辑: 在 SelectPlace 方法中,有一些代码在 UI 线程本身上运行,如下所示:

private boolean selectPlace(Place place){
GetFactories factoryMethod = new GetFactories(mApp, selectedCity);
        factoryMethod.call(); //This calls the WS and awaits results

        final ArrayList<Factory> factories =factoryMethod.getFactories();
        Factory selectedFactory = null;
        for(int i = 0; i < factories.size(); i++)
        {
///Some logic
}

//Some more logic...
}

不胜感激。 谢谢,

奥马尔

【问题讨论】:

  • @Segi ,这是 dialogBu​​ilder 和项目选择逻辑的完整代码。我可以添加在 selectPlace() 方法中调用的代码,但我怀疑有人会阅读这么长的代码。您能否解释一下为什么它是相关的,以便我尝试只提供相关的代码片段?谢谢
  • 我需要您的网络服务调用代码。我的意思是 ui 线程或 asynctask 部分..
  • 好的,添加代码。希望这会有所帮助
  • 有没有从 selectPlace 方法得到响应??

标签: android android-alertdialog toast


【解决方案1】:

您可能希望将 Web 服务调用代码移动到 IntentService 类中,以便在等待 Web 服务返回响应时不会阻塞 UI 线程。

查看您的代码,factoryMethod.call(); 可能正在阻塞 UI 线程。

【讨论】:

  • 我确定它确实会阻塞。这就是为什么我在调用 WS 之前调用 Toast。我猜 UI 线程不会立即显示它。
  • 是的,之前调用并不能保证 Toast 会在 UI 线程被您的 WS 调用阻塞之前及时显示。
猜你喜欢
  • 1970-01-01
  • 2014-05-30
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多