0

gridView に画像を表示しようとしています。画像は、ElasticSearch サーバーでの調査に基づいています。ユーザーがテキストフィールドにキーワードを入力すると、ElasticSearch でのクエリの結果が文字列 (画像の URL) のリストになり、画像が gridView に表示されます。

調査を行うためにボタンを押したときのアクション:

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 のバックグラウンド プロセス/スレッドが終了した後にのみ実行されます。どうやってやるの?

4

1 に答える 1

1

から呼び出すのではなく、内部gridView.setAdapter(imgAdapter);onPostExecute()メソッドを呼び出すだけです。これは、メソッドが終了した後にのみ呼び出されることが保証されており、メイン スレッドで呼び出されるため、UI に触れても安全です。AsyncTasksendMessage()doInBackground()

例えば:

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();
}
于 2012-11-29T00:14:38.080 に答える