Hy !!Логическая проблема между основным классом и классом резьбы
Я делаю новый Object
от Thread
Класс. В методе запуска есть Http-Post с результирующей строкой.
Мой вопрос:
Как можно уведомить главный класс, что загрузка закончена?
MFG
Hy !!Логическая проблема между основным классом и классом резьбы
Я делаю новый Object
от Thread
Класс. В методе запуска есть Http-Post с результирующей строкой.
Мой вопрос:
Как можно уведомить главный класс, что загрузка закончена?
MFG
Посмотрите на AsyncTask
класс, который поможет вам погрузочно-разгрузочные работы в другом потоке, чем в потоке пользовательского интерфейса. Это очень полезный класс для платформы Android.
Вы просто создаете пользовательский класс, который наследует от AsyncTask, а затем переопределяете doInBackground()
и вставляете код, который должен выполняться в своем потоке. В вашем случае это будет код для загрузки. Кроме того, вы должны переопределить onPostExecute()
, который вызывается автоматически при завершении метода doInBackground(). Объект, который вы вернули в методе doInBackground(), будет автоматически передан методу onPostExecute(). OnPostExecute() будет выполняться в потоке пользовательского интерфейса.
Таким образом, класс AsyncTask будет обрабатывать все материалы потоков для вас, и вы можете сосредоточиться на своей работе.
Посмотрите на tutorial on the Android Developer site.
Вместо того, чтобы создать поток, создать 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);
Если на "основной класс" вы имеете в виду ваш 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();
}
Спасибо ... но как это сделать в двух классах? реализовать Callable. Как получить доступ из основного класса? –
user547995