我有一个应用程序,其中有谷歌地图,谷歌地图上的位置叠加以及一个单独的线程,每隔30秒就会将设备的当前位置发送到服务器。问题是当线程将位置发送到服务器时,设备屏幕停止,直到服务器响应。以下是代码
全球对象
private Handler handlerTimer = new Handler();
on onCreate Method
handlerTimer.removeCallbacks(taskUpdateStuffOnDialog );
handlerTimer.postDelayed(taskUpdateStuffOnDialog , 100);
这是taskUpdateStuffOnDialog
private Runnable taskUpdateStuffOnDialog = new Runnable()
{
public void run()
{
try
{
URL url3 = new URL("http://"+ appState.getURL()+"//iLocator/IDForClient.php?reg_no="+ Device_ID[0]);
HttpURLConnection conn = (HttpURLConnection) url3.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String quote = reader.readLine();
while (quote != null)
{
Device_ID = quote.split("\n");
quote = reader.readLine();
bCheckID = true;
}//End While
positionOverlay.setID(Device_ID[0]);
addEvent(Device_ID[0]);
}//End try
catch (Exception e)
{
e.printStackTrace();
Toast.makeText(MainMapActivity.this, "Communication Issue",Toast.LENGTH_LONG).show();
}//End catch
handlerTimer.postDelayed(this, 9000);
}
};
请告诉我我的代码有什么问题。
答案 0 :(得分:1)
问题在于,虽然您正在生成新的线程,但您并未生成新的进程。你正在做的一切仍然在用户界面过程中,这就是阻塞。您可以找到有关on developer.android.com主题的更多信息。
解决此问题的最快捷,最简单的方法是使用IntentService类。它只允许一次执行一个HTTP请求,但会为您解决所有问题。
答案 1 :(得分:0)
尝试使用AsyncTask连接到服务器。请在此处查看示例:http://developer.android.com/reference/android/os/AsyncTask.html