0

早上好,我的 android 应用程序上有一个按钮,它通过 AsyncTask 在网络上(通过谷歌端点)启动搜索。我的问题是按钮在 AsyncTask 完成之前不会“取消单击”,这可能需要几秒钟。当互联网连接速度很慢时,这甚至会使应用程序崩溃,无论如何应用程序完全卡住,直到 AsyncTask 完成。现在使用 AsyncTask 的原因正是为了消除这个问题,所以我真的不明白会发生什么!

这是 OnClickListener:

SearchListener = new OnClickListener() {
  @Override
  public void onClick(View v) {     
      String cname=TextCourse.getText().toString();
      if (!cname.isEmpty()){
          try {
              CollectionResponseWine listavini= new QueryWinesTask(messageEndpoint,cname,5).execute().get();
          } catch (InterruptedException e) {
              showDialog("Errore ricerca");
              e.printStackTrace();
          } catch (ExecutionException e) {
              showDialog("Errore ricerca");
              e.printStackTrace();
          }              
      } else{
          showDialog("Inserisci un piatto");
      }
  }
};

这是被调用的 AsyncTask:

private class QueryWinesTask 
extends AsyncTask<Void, Void, CollectionResponseWine> {
  Exception exceptionThrown = null;
  MessageEndpoint messageEndpoint;
  String cname;
  Integer limit;

  public QueryWinesTask(MessageEndpoint messageEndpoint, String cname, Integer limit) {
      this.messageEndpoint = messageEndpoint;
      this.cname=cname;
      this.limit=limit;
  }

  @Override
  protected CollectionResponseWine doInBackground(Void... params) {
      try {
          CollectionResponseWine wines = messageEndpoint.listwines().setCoursename(cname).setLimit(limit).execute();                    
          return wines;
      } catch (IOException e) {
          exceptionThrown = e;
          return null;
          //Handle exception in PostExecute
      }            
  }

  protected void onPostExecute(CollectionResponseWine wines) {
      // Check if exception was thrown
      if (exceptionThrown != null) {
          Log.e(RegisterActivity.class.getName(), 
                  "Exception when listing Messages", exceptionThrown);
          showDialog("Non ci sono vini associati al tuo piatto. Aggiungine uno!");
      }
      else {

          messageView.setText("Vini piu' votati per " + 
                  cname + ":\n\n");
          for(Wine wine : wines.getItems()) {
              messageView.append(wine.getName() + " (" + wine.getScore() + ")\n");
          }
      }
  }  
}
4

1 回答 1

3

...execute().get()正在阻塞。它使 UI 线程等待 Task 完成。

不要做get()。用于onPostExecute()获取wines任务的结果 ( ) 并更新 UI。

于 2013-08-16T07:39:57.133 回答