我用线程创建了一个tcp套接字,效果很好。现在我需要向服务器发送请求并收听它。它可以在100秒后回答我。所以我认为使用asynctask,但100秒是很多... 所以我在一个类中使用IntentService(这个类是私有的,因为在另一个类中):
public class Generate extends Fragment
{
/* ***
the code about of my app
*** */
private class Position extends IntentService
{
public Position()
{
super("Position");
}
protected void onHandleIntent(Intent intent)
{
try
{
socket.setSoTimeout(100000);
PrintWriter out = new PrintWriter(socket.getOutputStream());
out.write("TX_DATA");
byte[] bytes = new byte[1000];
StringBuilder reader = new StringBuilder();
int numRead = 0;
if ((numRead = socket.getInputStream().read(bytes)) >= 0)
{
reader.append(new String(bytes, 0, numRead));
}
if(reader.toString().equals("RX_DATA"))
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"Data received",Toast.LENGTH_LONG).show();
}
});
}
catch (SocketException e)
{
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
但是......如果我需要的话,这是正确的吗?我需要等待100秒,听取服务器的答案,升级UI并关闭服务...... 这种意图服务如何运作? 谢谢你的回答
答案 0 :(得分:0)
所以我认为使用asynctask,但100秒是很多
是。特别是,如果用户离开您的应用(例如,BACK,HOME),Android可能会在您的工作完成之前终止您的流程。
所以我使用IntentService
在这种情况下,这比AsyncTask
要好。如果您的后台工作需要花费的时间超过几秒钟,那么通过服务管理后台工作会增加您的流程足够长的时间来完成这项工作。
在100多秒内,您还会遇到设备在工作完成之前入睡的问题。您需要使用WakeLock
(可能通过my WakefulIntentService
)和WifiLock
来确保一切都保持稳定。