Отображение ProgressDialog во время поиска в Android - PullRequest
0 голосов
/ 01 марта 2011

Я прочитал все Вопросы о stackoverflow, которые могут дать мне подсказку с этим, но я не могу заставить это работать.

Что у меня есть:

IУ меня есть актив под названием «список желаний», который запускает мое приложение.В этом упражнении у меня есть кнопка, которая запускает поиск через onSearchRequested ();

У меня есть еще одно действие, называемое discogssearch, которое выполняет вызов XML Api в Интернете, анализирует данные и отображает результаты поиска..

Все это работает нормально.

Чего я хочу достичь:

Я хочу отображать ProgessDialog, в то время как API-вызов требует много времени.выдается.

То, что я пробовал:

Я попытался открыть ProgessDialog многими способами, прежде чем поиск начался, и обнаружил, что я должен сделать это асинхронно сосновная нить.Поэтому я поместил трудоемкий код в AsyncTask и запустил его.

Что происходит:

Когда я вводил текст и нажимал, ничего не происходило (как раньше), покарезультаты приходят.Теперь отображается перспектива «discogssearch» с результатами, и отображается ProgressDialog, но на этом этапе вся работа уже выполнена.

Мой код:

wantlist.java

public class wantlist extends Activity implements OnClickListener {
/** Called when the activity is first created. */

ArrayList<Want> wants = new ArrayList<Want>();

@Override
public void onCreate(Bundle savedInstanceState) {        

    wants.add(new Want("Want1"));
    wants.add(new Want("Want2"));
    wants.add(new Want("Want3"));
    wants.add(new Want("Want4"));
    wants.add(new Want("Want5"));

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    ListView lv = (ListView) findViewById(R.id.WantList); 
    ImageButton b = (ImageButton) findViewById(R.id.searchbutton);
    b.setOnClickListener(this);

    lv.setAdapter(new WantAdapter(this,
            R.layout.lplistitem, wants));
    lv.setTextFilterEnabled(true);

}

public void onClick(View v) {
    onSearchRequested();

}

}

discogssearch.java

public class discogssearch extends Activity implements OnItemClickListener{
/** Called when the activity is first created. */

private static final int PROGRESS_DIALOG = 0;
private static final String LOGTAG = discogssearch.class.getName();

@Override
  public void onAttachedToWindow() {
    super.onAttachedToWindow();
    Window window = getWindow();
    // Eliminates color banding
    window.setFormat(PixelFormat.RGBA_8888);
  }


private ListView alv = null;
private ListView rlv = null;
private ListView llv = null;

ArrayList<Want> results = new ArrayList<Want>();
View.OnTouchListener gestureListener;
GestureDetector pageFlip;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.searchresults);

    Intent intent = getIntent();


      String query = intent.getStringExtra(SearchManager.QUERY);

      searchDiscogs(query);

}

public void searchDiscogs(String query)
{   
    query = URLEncoder.encode(query);
    alv = (ListView) findViewById(R.id.ArtistList);
    rlv = (ListView) findViewById(R.id.ReleaseList);
    llv = (ListView) findViewById(R.id.LabelList);

    rlv.setOnItemClickListener(this);

    rlv.setFastScrollEnabled(true);
    rlv.setVerticalFadingEdgeEnabled(true);

    results.clear();


    AsyncTask<String, Integer, DiscogsXMLHandler> at = new AsyncDiscogsSearch().execute(query);
    DiscogsXMLHandler discogsHandler = null;

    try {
        discogsHandler = at.get();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    Log.d("WICHTIG: ",discogsHandler.getReleaseResults().size() + "");

    alv.setAdapter(new WantAdapter(this,
            R.layout.lplistitem, discogsHandler.getArtistResults()));

    rlv.setAdapter(new WantAdapter(this,
            R.layout.lplistitem, discogsHandler.getReleaseResults()));

    llv.setAdapter(new WantAdapter(this,
            R.layout.lplistitem, discogsHandler.getLabelResults()));
}

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
        long arg3) {

    if(arg0.equals(rlv))
    {
        String uri = ((Want)rlv.getItemAtPosition(arg2)).getDetailsUri();
        Log.d("Itemclick", uri);
        Intent viewUri = new Intent("android.intent.action.VIEW", Uri.parse(uri));
        viewUri.setClass(this, releasedetails.class);
        startActivity(viewUri);
    }


}

public Dialog onCreateDialog(int dial)
{

    switch(dial) {
    case PROGRESS_DIALOG:
        Log.d(LOGTAG,"Showing Progress Dialog");
        ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Loading...");
        return progressDialog;
    default:
        return null;
    }
}

private Animation inFromRightAnimation() {
      Animation inFromRight = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT, +1.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f);
      inFromRight.setDuration(100);
      inFromRight.setInterpolator(new AccelerateInterpolator());
      return inFromRight;
     }

     private Animation outToLeftAnimation() {
      Animation outtoLeft = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, -1.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f);
      outtoLeft.setDuration(100);
      outtoLeft.setInterpolator(new AccelerateInterpolator());
      return outtoLeft;
     }

     private Animation inFromLeftAnimation() {
      Animation inFromLeft = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT, -1.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f);
      inFromLeft.setDuration(100);
      inFromLeft.setInterpolator(new AccelerateInterpolator());
      return inFromLeft;
     }

     private Animation outToRightAnimation() {
      Animation outtoRight = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, +1.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f,
        Animation.RELATIVE_TO_PARENT, 0.0f);
      outtoRight.setDuration(100);
      outtoRight.setInterpolator(new AccelerateInterpolator());
      return outtoRight;
     }

     private class AsyncDiscogsSearch extends AsyncTask<String, Integer, DiscogsXMLHandler>{

            public static final String APIKEY = "xxxxxxxx";
            private final ProgressDialog pg = new ProgressDialog(discogssearch.this);

            @Override
            protected DiscogsXMLHandler doInBackground(String... params) {

                String urlString = "http://www.discogs.com/search?type=all&q="+params[0]+"&f=xml&api_key="+APIKEY ;

                //Retrieve XML-Data as InputStream
                InputStream instream = GZipStreamHelper.getStream(urlString);

                //Parse XML-Data
                DiscogsXMLHandler discogsHandler = new DiscogsXMLHandler();
                XMLParsingHelper.getInstance().parseAndHandle(instream, discogsHandler);

                return discogsHandler;
            }

            @Override
            protected void onPostExecute(DiscogsXMLHandler result) {
                // TODO Auto-generated method stub
                pg.dismiss();
            }

            @Override
            protected void onPreExecute() {
                pg.show();
            }




        }

}

Спасибоза любые предложения!

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Я думаю, что user634618 правильный.Документация для AsyncTask#get() гласит:

При необходимости ждет завершения вычисления и затем извлекает его результат.

(выделение добавлено).Таким образом, поток пользовательского интерфейса просто сидит на вызове get, и вы теряете смысл выполнения AsyncTask.Поскольку поток пользовательского интерфейса заблокирован, ваш запрос на отображение диалогового окна хода выполнения не выполняется.

Как предлагает пользователь634618, вы можете обработать результат поиска в onPostExecute, что освободит поток пользовательского интерфейса и позволитваш диалог прогресса для отображения.

1 голос
/ 01 марта 2011

Насколько я понимаю, ваша строка discogsHandler = at.get(); блокирует ваш поток пользовательского интерфейса. OnPreExecute выполняется, но это только помещает диалог прогресса в цикл сообщений основного потока. Однако код, который фактически открывает и обрабатывает диалоговое окно, выполняется после возврата из searchDiscogs()

Решением было бы поместить вашу обработку результата запроса в AsyncTask s onPostExecute или вызвать метод обработки результата оттуда.

...