【发布时间】: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