2011-01-28 6 views
2

Hy !!メインクラスとスレッドクラス間の論理問題

Threadクラスから新しいObjectを作りました。 runメソッドには結果文字列を持つHttp-Postがあります。

私の質問:

どのようにダウンロードが終了したことをメインクラスに通知することができますか?

代わりにスレッドを作成するMFG

答えて

1

を使用すると、UIスレッドとは別のスレッドで作業を取り扱うことができますAsyncTaskクラスを見てください。これはAndroidフレームワークの非常に有用なクラスです。

AsyncTaskから継承するカスタムクラスを作成してからdoInBackground()をオーバーライドし、実行するコードを独自のスレッドに挿入するだけです。あなたの場合、これはダウンロードを行うコードになります。さらに、doInBackground()メソッドが終了したときに自動的に呼び出されるonPostExecute()をオーバーライドする必要があります。 doInBackground()メソッドで返されたオブジェクトは、自動的にonPostExecute()メソッドに渡されます。 onPostExecute()は、UIスレッドで実行されます。

したがって、AsyncTaskクラスはすべてのスレッドを処理し、作業に集中できます。

tutorial on the Android Developer siteをご覧ください。

0

Callableを作成しsubmit()方法によりExecutorServiceに渡し:ExecutorService戻りFutureオブジェクトにCallableオブジェクトを送信

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

。その後、Futureget()メソッドは、タスクが完了し、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

ありがとう...しかし、2つのクラスでそれを作る方法は? 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(); 
}