2012-02-28 3 views
0

Я пытаюсь реализовать петлитель, чтобы создать поток для отправки координат GPS в базу данных. Я новичок в Java, и все это запутывает, но, может быть, вы можете помочь. Следующий метод класса вызывается основным действием при нажатии кнопки. Метод находит местоположение GPS, а затем отправляет его методу другого класса, который отправляет широту и долготу (вместе с идентификатором пользователя) в базу данных. У меня возникают проблемы с тем, что приложение замедляется и время от времени зависает, поэтому мне кажется, что мне нужно реализовать какой-то способ создания нового потока для этого процесса. Есть идеи. Я ноб, будь осторожен. Вот мой код:Создать новую тему - Android

public class LocationActivity extends Thread{ 

    private LocationManager locManager; 
    private LocationListener locListener; 

    public void startLocation(Context context, String usr_id2) 
    { 
     final String usr = usr_id2; 

    //get a reference to the LocationManager 
    locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 


    //checked to receive updates from the position 
    locListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      SendActivity.send(location, usr); 
     } 
     public void onProviderDisabled(String provider){ 
      //labelState.setText("Provider OFF"); 
     } 
     public void onProviderEnabled(String provider){ 
      //labelState.setText("Provider ON "); 
     } 
     public void onStatusChanged(String provider, int status, Bundle extras){ 
      //Log.i("", "Provider Status: " + status); 
      } 
     }; 

     Looper looper = null; 
     locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener, looper); 
    } 
} 

Еще один вопрос, я бы добавить петлитель здесь или в классе, который фактически отправляет информацию в базу данных? Он использует HTTP-сообщение для отправки в программу PHP, которая добавляет информацию в базу данных MySQL.

ответ

4

У меня было бы желание попробовать другую тактику здесь. У Android есть класс под названием AsynTask, который написан, чтобы облегчить нагрузку на разработчиков по разгрузке, которые должны выполняться в потоке.

AsyncTask обеспечивает правильное и легкое использование нити пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками.

С точки зрения записи в БД и отправки данных обратно на сервер, я смотрел бы на использовании Service, но помните, что только служба, которая изначально не работает на потоке пользовательского интерфейса является IntentService

1

Для таких операций вам следует использовать класс AsyncTask, он довольно прост в использовании и обеспечивает простой способ синхронизации с потоком пользовательского интерфейса. Here's хороший пост про потоки в Android, вы можете узнать больше о AsyncTask в документах для Android. Надеюсь это поможет.

0

Вы не можете получить доступ к «контексту» или любому объекту пользовательского интерфейса из пользовательского потока. Это происходит потому, что они сделаны в основном потоке пользовательского интерфейса, и вы не можете получить доступ к этим объектам из потока.

Как Мартин сказал, вам нужно создать AsyncTask или использовать обработчики для доступа к контексту/ui.

В вашем случае перейдите к AsyncTask