2016-08-19 5 views
0

私はAndroidデバイス用のスレッドでこのコードを実行しています。最初は十分でしたが、HTTP POSTの後に結果を返すように要求を変更しました。 "POST"関数は別のクラスにありますので、以下のコードは機能しません。このコードを変更してスレッド操作の結果を受け取る方法は?

私は、RunnableFutureが結果を返すために結果を抽出できることを読んでいます。誰かがこのコードを変更する方法を教えてくれますか?

public ArrayList<String> addfood(final String status, final String spaceId) { 
    Log.d(TAG, "Add Food"); 

    final ArrayList<String> results = new ArrayList<>(); 


    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 

      try { 
       String cookie = android.webkit.CookieManager.getInstance().getCookie(sURL); 
     Uri.Builder builder = new Uri.Builder() 
       .appendQueryParameter(“status”,status) 
       .appendQueryParameter("cookie", cookie) 
       .appendQueryParameter("space", spaceId); 

       String addresult = foodpost(POST(url, builder)); 
       results.add(addresult); 


      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    thread.start(); 

    return results; 
} 
+0

おそらく最良の解決策ではなく、回避策である可能性があります。 HTTP POST結果を格納するグローバル変数を作成しようとしましたか?必要なクラスでは、グローバル変数が特定のタイムアウト値までヌルでなくなるまで待つことができます。 –

答えて

0

私はあなたに物事のペアを明確にしましょう:

分析1つのスレッドの内部からのコード(あなたのコメントで言ったように)あなたが他のクラスの別のメソッドにアクセスしようとしているのあなたの作品:

「POST」機能が別のクラスであるので、以下のコードは動作しません

あなたはREFEを持っている必要がありますので、それは動作しません。このメソッドを使用するには、他のオブジェクトに戻ります。

しかし、私はあなたに物事のカップルを聞いてみましょう:

  1. 同時実行が(非常に硬い)ハードです。 POSTメソッドを正しく使用するようにコードを修正した後でも、そのスレッドで何が起こったのか考えたことがありますか?ユーザーがデバイスを回転させるとどうなりますか? UiThread(あなたのアプリケーションのすべてのUI要素を更新するスレッド)が再リストのリストを読むことに決めたら(スレッドセーフでもありますか?)私は、いくつかのバックグラウンド操作を行うスレッドを作成する前に注意を払うことに多くの考慮事項があることを意味します。そして、私を信じて、間違ったことをするのはとても簡単です。たぶんit can leak memoryとアプリが応答しなくなる可能性があります。あなたは必要だと思いますか?
  2. このようなネットワーク要求を容易に達成するのに役立つライブラリがたくさんあります。バックグラウンドの処理を重視しています。それらの図書館は非常に闘いのテストを受けています。 RetrofitVolleyのようなライブラリは、あなたが達成したいことを何でもするための非常に良いオプションです。それでは、それを使用しない必要がありますか?

申し訳ありませんが、スレッドを使用することをお勧めしますが、長期的に役立つ便利なオプションがたくさんあります。

関連する問題