2017-06-24 8 views
1

現在、Android Studioを使用しているプロジェクトで作業しています。私はAsyncTaskを使用しなければならなかったソケットを使用していくつかのアクションを完了するには。 私のデータベースで利用可能なサプリメントのリストを取得しようとしています。その後、クライアントはこのサプリメントのいくつかを選択して確認します。アクティビティは、コマンドの総価格を計算するために変更されます。Android AsyncTaskオーダーサーバー接続

このAsyncTaskは、(非常によく動作します)データベースにサプリメントを取得

public class suppTask extends AsyncTask<Void, Void, Boolean> { 

    public ArrayList<Dessert> listDessert; 

    suppTask() { 
     this.listDessert=new ArrayList<Dessert>(); 
    } 


    @Override 
    public Boolean doInBackground(Void... params) { 
     // TODO: attempt authentication against a network service. 
      Requester client = new Requester(); 

      ArrayList<Dessert> desserts = client.getDessert(); 
      ArrayList<Opening> openings= client.getOpening(); 
      ArrayList<Drinks> drinks = client.getDrink(); 
      ArrayList<Snacks> snacks = client.getSnacks(); 
      Menu menu = client.getMenu(type,num); 

      //All Supplements.something references to static Arraylist or obj 
      Supplement.d=desserts; 
      Supplement.o=openings; 
      Supplement.s=snacks; 
      Supplement.d=drinks; 
      Supplement.m= menu; 

     return true; 
    } 

GET機能の一つの例(同じ摂餌以下、 完全に罰金):

ArrayList<Dessert> getDessert() 
{ 
    connectToServer(); //Connection to the server //with static attributes 

    ArrayList<Dessert> listDessert = new ArrayList<Dessert>(); 
    JSONArray jArray = new JSONArray(); 
    String s=""; 
    try { 

     this.message = (String)this.in.readObject(); //message receive from server 

     this.sendMessage("askDessert"); //message sent to server 

     s = (String) this.in.readObject(); //received from server 
     jArray=strToJson(s); 

     this.message = "bye"; 
     this.sendMessage(this.message); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    finally { 
     this.stopConnection(); //Disconnect the stream 
    } 


    listDessert=fromJSONDessert(jArray); 

    return listDessert; 
} 

二AsyncTask(うまく動作し、合計金額を計算):

public static class totalTask extends AsyncTask<Void, Void, Boolean> { 

    @Override 
    public Boolean doInBackground(Void... params) { 
     Requester client = new Requester(); 
     total = client.getTotal("1:0:0:0:0"); //Ids of every Supplement in the dataBase 
     return true; 
    } 

} 

我々は(すべてのゲッターに使用)の接続を開く方法:

どう
void connectToServer() 
{ 
    try { 
     this.requestSocket=new Socket(host,port); 


     this.out = new ObjectOutputStream(this.requestSocket.getOutputStream()); 
     this.out.flush(); 


     this.in = new ObjectInputStream(this.requestSocket.getInputStream()); 


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

    } 

} 

に接続を停止します(すべてのゲッターで使用されます)

void stopConnection() 
{ 
    try { 
     this.in.close(); 
     this.out.close(); 
     this.requestSocket.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

問題は、両方のAsyncTaskが特定の順序で非常によく機能することです。私たちは、このようにそれらを呼び出すときにたとえば、ITワークス:

OtherActivity.totalTask to = new OtherActivity.totalTask(); 
    to.execute(); 

    suppTask t = new suppTask(); 
    t.execute(); 

事は、我々は、この最初のタスクが終了すると、第1および第その後、(逆の方法でsuppTaskそれらを呼び出す必要がありますアクティビティが変更され、タスクtotalTask​​が呼び出されます)。これを行うと、2番目のAsyncTaskで、関数getTotalが、connectToServer()関数が呼び出されたときに最初にクラッシュします。また、この行(到達したことがない)でブロック:

this.in = new ObjectInputStream(this.requestSocket.getInputStream());

だから、どのように我々はこの問題を解決するのですか?あなたの優しさと時間をありがとう。

答えて

0

これらは独立した非同期タスクです。 onPostExecute()本体に2番目のリクエストを入れる必要があります。

+0

ユーザーがコマンドを検証するまで待機する必要があります。なぜなら、2つの別個のファイルを作成した理由です。AsyncTask – SocialCar