【问题标题】:Android AsyncTask order server connectionAndroid AsyncTask 命令服务器连接
【发布时间】:2017-06-24 16:28:06
【问题描述】:

我目前正在使用 Android Studio 开发一个项目。为了使用套接字完成一些操作,我不得不使用 AsyncTask。 我正在尝试获取我的数据库中可用的补充剂列表。之后,客户选择其中的一些补充品并确认。更改活动以计算命令的总价格。

这个 AsyncTask 获取数据库中的 Supplements(效果很好)

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;
    }

}

我们如何打开连接(用于每个 getter):

    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();

    }

}

我们如何停止连接(用于每个 getter)

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

问题是两个 AsyncTask 都以特定的顺序单独工作得很好。例如,当我们这样称呼它们时,IT WORKS :

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

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

问题是我们需要以相反的方式调用它们(首先是suppTask,然后,当第一个任务完成并且活动已经改变时,任务totalTask​​被调用)。当我们这样做时,在第二个 AsyncTask 中,函数 getTotal 在调用函数 connectToServer() 时崩溃。它在这一行阻塞(从未到达):

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

那么我们该如何解决呢?感谢您的好意和时间。

【问题讨论】:

    标签: java android sockets android-asynctask server


    【解决方案1】:

    它们是独立的异步任务。您需要将第二个请求放在 onPostExecute() 正文中。

    【讨论】:

    • 我们需要等到用户验证命令,这就是我们创建两个不同的 AsyncTask 的原因
    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2013-04-03
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多