2011-01-28 3 views

ответ

1

Посмотрите на AsyncTask класс, который поможет вам погрузочно-разгрузочные работы в другом потоке, чем в потоке пользовательского интерфейса. Это очень полезный класс для платформы Android.

Вы просто создаете пользовательский класс, который наследует от AsyncTask, а затем переопределяете doInBackground() и вставляете код, который должен выполняться в своем потоке. В вашем случае это будет код для загрузки. Кроме того, вы должны переопределить onPostExecute(), который вызывается автоматически при завершении метода doInBackground(). Объект, который вы вернули в методе doInBackground(), будет автоматически передан методу onPostExecute(). OnPostExecute() будет выполняться в потоке пользовательского интерфейса.

Таким образом, класс AsyncTask будет обрабатывать все материалы потоков для вас, и вы можете сосредоточиться на своей работе.

Посмотрите на tutorial on the Android Developer site.

0

Вместо того, чтобы создать поток, создать Callable и передать его в ExecutorService путем метода submit():

Future<T> submit(Callable<T> task) 

Отправка Callable объекта к ExecutorService возвращает Future объект. Метод get()Future будет блокироваться до завершения задачи и будет содержать результаты Callable.

Пример:

Callable<String> callable = new Callable<String>(){ 
     @Override 
     public String call() throws Exception { 
      return "HELLO WORLD"; 
     } 
    }; 

    //executor with one thread 
    ExecutorService executor = Executors.newSingleThreadExecutor(); 

    Future<String> future = executor.submit(callable); 
    executor.shutdown(); 
    String result = future.get(); 
    System.out.println(result); 
+0

Спасибо ... но как это сделать в двух классах? реализовать Callable . Как получить доступ из основного класса? – user547995

1

Если на "основной класс" вы имеете в виду ваш Activity, то вы можете использовать Handler.

В вашей деятельности:

private static final int DOWNLOAD_COMPLETE = 0; 
... 

private Handler handler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) { 
     switch(msg.what){ 
     case DOWNLOAD_COMPLETE: 
      Log.d("MYTAG",msg.obj.toString()); 
      break; 
     } 
    } 
} 

И в каком-то другом классе:

public doBackgroundUpdate(Handler handler){ 
    Thread backgroundThread = new Thread() { 
     @Override 
     public void run() { 
      // do long-running post operation 

      // send result back to UI thread 
      Message msg = Message.obtain(); 
      msg.what = DOWNLOAD_COMPLETE; 
      msg.obj = "Result String to pass"; 
      handler.sendMessage(msg); 
     } 
    } 
    backgroundThread.start(); 
} 
Смежные вопросы