2015-08-20 2 views
2

У меня есть этот кусок кода, который я расскажу ниже. Он публикует идентификаторы пользователей, широту и долготу, которые в php обновляют текущие пользователи lat и long, а затем выполняет запрос, который извлекает массив пользователей, находящихся в определенной области вокруг вас. (Получает возраст, имя ..) Таким образом, это заполняет listView, но запрос должен быть выполнен вручную, путем обновления или открытия операции. Однако у меня есть LocationService, и в нем он имеет onLocationChanged(), который обновляется при изменении местоположения пользователя. Мне нужно, чтобы мой запрос/асинктас выполнялся каждый раз, когда местоположение изменяется, а затем заполняет мой список в моей активности. Любые предложения/примеры кода.AsyncTask Внутри службы, заполняющей ListView

Это код внутри моей деятельности, которая вызывает задачу асинхронной:

private void startQueryView() { 
    // show progress dialog 
    dialog = ProgressDialog.show(this, "", "Loading..."); 

    LocalDatabase localDatabase = new LocalDatabase(this); 
    User user = localDatabase.getLoggedInUser(); 
    String url = ServerRequests.SERVER_ADDRESS + "CombinedQuery.php"; 
    UserFetchData task = new UserFetchData(this, user.latitude, user.longitude, user.id); 
    task.execute(url); 
} 

@Override 
public void onFetchComplete(List<UserQueryData> data) { 
    // dismiss the progress dialog 
    if (dialog != null) dialog.dismiss(); 
    // create new adapter 
    final UserAdapter adapter = new UserAdapter(this, data); 
    listView.setAdapter(adapter); 



    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      final int userId = adapter.getItem(position).getId(); 

      int i; 
      new DownloadImage(LocationSearch.this, userId + "_Profile").execute(); 

      for (i = 2; i < 7; i++) { 

       new DownloadImage(LocationSearch.this, userId + "_Image" + Integer.toString(i)).execute(); 

      } 


      ServerRequests serverRequests = new ServerRequests(LocationSearch.this); 
      serverRequests.fetchDifUserDataInBackground(userId, new GetDifUserCallback() { 
       @Override 
       public void done(DifUser returnedDifUser) { 

        if (returnedDifUser == null) { 
         String dir = getFilesDir().getAbsolutePath(); 
         File file = new File(dir, userId + "_Profile.JPG"); 
         boolean deleted = file.delete(); 
         if (deleted) { 
          Log.d("THIS", "******************ProfileDeleted***********"); 
         } 

         int i; 
         for (i = 2; i < 7; i++) { 
          String dir2 = getFilesDir().getAbsolutePath(); 
          File file2 = new File(dir2, userId + "_Image" + Integer.toString(i) + ".JPG"); 
          boolean deleted2 = file2.delete(); 
          if (deleted2) { 
           Log.d("THIS", "******************Image" + Integer.toString(i) + "***********"); 
          } 

         } 

         Toast.makeText(LocationSearch.this, "Something went wrong!", Toast.LENGTH_SHORT).show(); 
        } else { 


         Intent userIdIntent = new Intent(LocationSearch.this, UserProfileOpened.class); 
         SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE); 
         SharedPreferences.Editor editor = sharedPref.edit(); 
         editor.putInt("userId", userId); 
         editor.commit(); 
         userIdIntent.putExtra("userId", userId); 
         userIdIntent.putExtra("name", returnedDifUser.name); 
         userIdIntent.putExtra("city", returnedDifUser.city); 
         userIdIntent.putExtra("age", returnedDifUser.age); 
         userIdIntent.putExtra("gender", returnedDifUser.gender); 
         userIdIntent.putExtra("places", returnedDifUser.places); 
         userIdIntent.putExtra("relationship", returnedDifUser.relationship); 
         userIdIntent.putExtra("facebook", returnedDifUser.facebook); 
         startActivity(userIdIntent); 


        } 
       } 
      }); 


     } 
    }); 

} 

@Override 
public void onFetchFailure(String msg) { 
    // dismiss the progress dialog 
    if (dialog != null) dialog.dismiss(); 
    // show failure message 
    Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); 
} 

Если вам нужно что-нибудь еще, скажите, пожалуйста, и я буду править свой пост.

ответ

2

Редактировать: Give Intent s a shot.

Оформить Intent действие, как так:

public static String QUERY = "com.package.QUERY";

Затем расширить BroadcastReceiver в своей деятельности:

private class QueryReceiver extends BroadcastReceiver { 
    @Override 
    public void OnReceive(Context c, Intent i) { 
    startQueryView(); /*running your query when receiving an Intent*/ 
    } 
} 

Тогда в вашем методе деятельности OnCreate(), настроить слушателя:

IntentFilter filter = new IntentFilter(QUERY); 
receiver = new QueryReceiver(); 
registerReceiver(receiver,filter); /* registering the receiver to receive only intents with the action QUERY */ 

Наконец, в месте слушателя, отстреливать Intent:

Intent i = new Intent(QUERY); 
sendBroadcast(i); 

Вы должны взглянуть на документацию для LocationListener.

http://developer.android.com/reference/android/location/LocationListener.html

Используя это, вы будете знать всякий раз, когда Шир/изменения вашего пользователя!

+0

Я знаю, что когда мой lat/long изменяется, мне нужна помощь, связанная с действием, которое происходит после его изменения. Это включает в себя запуск асинтез в службе, так что оттуда данные, которые извлекаются из базы данных, заполняют listView в рамках Activity, в котором была запущена служба. –

+1

Непонятно, что вы просите. Не могли бы вы пересмотреть свой вопрос и, возможно, указать, в чем проблема? – nukeforum

+0

«Однако у меня есть служба LocationService, и в нем есть onLocationChanged(), который обновляется при изменении местоположения пользователя. Мой запрос/асинтекс выполняется каждый раз, когда местоположение изменяется, а затем заполняет мой списокView в моей активности». Я думал, что это достаточно ясно. Код, который я предоставил, находится в моей деятельности, но я хочу его в своей службе в onLocationChanged(), так что запрос выполняется каждый раз, когда изменяется местоположение пользователя. Который тогда и то же время заполнит мой listView новыми данными. –

Смежные вопросы