2012-11-29 1 views
0

gridView에 이미지를 표시하려고합니다. 이 이미지는 ElasticSearch 서버에 대한 연구 결과입니다. 사용자가 텍스트 필드에 키워드를 지정하면 ElasticSearch의 쿼리 결과는 문자열 목록 (이미지 URL)이며 이미지는 gridView에 표시됩니다.asynctask로 "예약"프로그램?

내가 연구하게하기 위해 버튼을 누르면 동작 :

public void sendMessage(View view){ 

    imgAdapter.clearmThumbIds(); //mThumbs is a list of string (urls image) 

    gridView = (GridView) findViewById(R.id.grid_view); 
    EditText editText = (EditText) findViewById(R.id.searchBar); 
    String message = editText.getText().toString();   
    try { 
     eSearchElastic.ESE(imgAdapter,message); 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println("Etape 2"); 
    gridView.setAdapter(imgAdapter); 


} 

eSearchElastic.java

public static void ESE (final ImageAdapter imgAdapter,final String keyword)throws ClientProtocolException, IOException { 

AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>(){ 
    @Override 
    protected Void doInBackground(Void... params) { 

     //Build the query, connect to ElasticServer and receive a list or urls of image as answer 
     System.out.println("Etape 1"); 
     return null; 
    } 

}; 
task.execute();} 

그리고 Etape1 전에이 인쇄 Etape2의 결과를 내가이 줄을 싶습니다 "gridView.setAdapter (imgAdapter)"는 eSearchElastic의 백그라운드 프로세스/스레드가 완료된 후에 만 ​​실행됩니다. 어떻게하면됩니까?

답변

1

그냥 sendMessage()에서 호출하는 대신 AsyncTask 내부의 onPostExecute() 방법에 gridView.setAdapter(imgAdapter);를 호출합니다. 이는 doInBackground() 메서드가 끝난 후에 만 ​​호출되도록 보장되며 메인 스레드에서 호출되므로 UI를 건 드리면 안전합니다.

예 :

public static void ESE (final GridView gridView, final ImageAdapter imgAdapter, final String keyword) throws ClientProtocolException, IOException { 

    AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>(){ 
     @Override 
     protected Void doInBackground(Void... params) { 
      // Build the query, connect to ElasticServer and receive a list or urls of image as answer 
      System.out.println("Etape 1"); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      gridView.setAdapter(imgAdapter); 
     } 
    }; 
    task.execute(); 
} 
+0

내가 추가 할 때 방법 onPostExecute(), I는 경고가 : "방법 AsyncTask를에서 onPostExecute()가 <무효가 무효가 무효가> 로컬로 사용되지 않습니다"를? – GermainGum

+0

Void 매개 변수가 있는지 확인하십시오. onPostExecute (Void result) {} – Hexar

+0

Thx 이제 작동하지만 void 매개 변수와이 줄이 필요한 이유를 모르겠습니다. super.onPostExecute (result); – GermainGum

관련 문제