0

いくつかの項目を持つ alertDialog があります。項目が選択されると、いくつかの Web サービス呼び出しがあり、それらが完了したときにのみダイアログが閉じます。ユーザーに、待つ必要があることを知らせたいと思います。

プログレスバーとトーストを使ってみました。トースト バージョンでは、トーストを表示するだけで表示されますが、ダイアログが閉じられた後にのみ表示されます。

また、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...
}

助けていただければ幸いです。ありがとう、

オマー

4

1 に答える 1

1

Web サービスの呼び出しコードをIntentServiceクラスに移動して、Web サービスが応答を返すのを待っている間に UI スレッドがブロックされないようにすることができます。

コードを見ると、factoryMethod.call();おそらく UI スレッドがブロックされています。

于 2013-06-12T05:49:03.463 に答える