Hy !!メインクラスとスレッドクラス間の論理問題
Thread
クラスから新しいObject
を作りました。 runメソッドには結果文字列を持つHttp-Postがあります。
私の質問:
どのようにダウンロードが終了したことをメインクラスに通知することができますか?
代わりにスレッドを作成するMFG
Hy !!メインクラスとスレッドクラス間の論理問題
Thread
クラスから新しいObject
を作りました。 runメソッドには結果文字列を持つHttp-Postがあります。
私の質問:
どのようにダウンロードが終了したことをメインクラスに通知することができますか?
代わりにスレッドを作成するMFG
を使用すると、UIスレッドとは別のスレッドで作業を取り扱うことができますAsyncTask
クラスを見てください。これはAndroidフレームワークの非常に有用なクラスです。
AsyncTaskから継承するカスタムクラスを作成してからdoInBackground()
をオーバーライドし、実行するコードを独自のスレッドに挿入するだけです。あなたの場合、これはダウンロードを行うコードになります。さらに、doInBackground()メソッドが終了したときに自動的に呼び出されるonPostExecute()
をオーバーライドする必要があります。 doInBackground()メソッドで返されたオブジェクトは、自動的にonPostExecute()メソッドに渡されます。 onPostExecute()は、UIスレッドで実行されます。
したがって、AsyncTaskクラスはすべてのスレッドを処理し、作業に集中できます。
、Callable
を作成しsubmit()
方法によりExecutorService
に渡し:ExecutorService
戻りFuture
オブジェクトにCallable
オブジェクトを送信
Future<T> submit(Callable<T> task)
。その後、Future
のget()
メソッドは、タスクが完了し、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();
}
ありがとう...しかし、2つのクラスでそれを作る方法は? Callableを実装します。メインクラスからアクセスするには? –
user547995