2010-12-28 3 views
0

Я использую код, предоставленный Fedor, в следующей ссылке, чтобы получить широту и долготу из моего простого демонстрационного приложения. Я пытаюсь получить широту и долготу, используя класс MyLocation, предоставленный им в этой ссылке.Продвинутый диалог увольняется до завершения потока - Android

What is the simplest and most robust way to get the user's current location on Android?

Я стараюсь принести широту и долготу на кнопку мыши. При нажатии кнопки я запускаю задачу асинхронной передачи и делегирую работу по извлечению местоположения в фоновом режиме моей асинтезы.

pre execute - progressdialog начато. post execute - диалог прогресса отклонен.

Вот как должен работать диалог прогресса в моем коде, и вот проблема, которая у меня есть. Диалог хода выполнения инициируется правильно, но даже до того, как широта и долгота будут напечатаны в методе doinbackground, диалог прогресса будет отклонен.

Я не понимаю, почему это происходит.

Вот мой передний конец деятельности

public class LocationServices extends Activity { 
MyLocation myLocation = new MyLocation(); 
LocationResult locationResult; 
TextView tv1, tv2; 
Location location; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    tv1 = (TextView) findViewById(R.id.tv1); 
    tv2 = (TextView) findViewById(R.id.tv2); 


    Button btn = (Button) findViewById(R.id.Button01); 
    btn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      new LocationAsyncTasking().execute(); 

     } 
    }); 

} 

public class LocationAsyncTasking extends AsyncTask<String, Void, Void> { 

    ProgressDialog dialog; 
    int totalAvail; 

    protected void onPreExecute() { 

     // this.dialog.setMessage("Inserting data..."); 
     dialog = new ProgressDialog(LocationServices.this); 
     this.dialog.setMessage("Fetching data..."); 
     this.dialog.show(); 
    } 

    protected Void doInBackground(String... args) { 
     Looper.prepare(); 

     locationResult = new LocationResult() { 

      public void gotLocation(Location location) { 
       // TODO Auto-generated method stub 

       // LocationServices.this.location = location; 
       System.out.println("Progress dialog should be present now - latitude"+location.getLatitude()); 
       System.out.println("Progress dialog should be present now - longitude"+location.getLongitude()); 
      } 
     }; 
     myLocation.getLocation(LocationServices.this, locationResult); 

     return (null); 
    } 

    protected void onProgressUpdate(Integer... progress) { 

    } 

    protected void onPostExecute(Void unused) { 
     dialog.dismiss(); 
    } 

} 

}

Я очень озадачен, думая о том, что делает этот диалог прогресса исчезнет еще до того, СОП в doinbackground закончена.

Эксперты, пожалуйста, помогите мне понять и решить эту проблему.

Любая помощь в этом отношении приветствуется.

Глядя вперед, С наилучшими пожеланиями, Рони

ответ

0

Что-то в этом роде. Просто добавьте ProgressDialog, если вам это нужно.

public class LocationServices extends Activity { 
    MyLocation myLocation = new MyLocation(); 
    TextView tv1, tv2; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     tv1 = (TextView) findViewById(R.id.tv1); 
     tv2 = (TextView) findViewById(R.id.tv2); 

     Button btn = (Button) findViewById(R.id.Button01); 
     btn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       myLocation.getLocation(LocationServices.this, locationResult); 
      } 
     }); 

    } 

    public LocationResult locationResult = new LocationResult() { 
      public void gotLocation(Location location) { 
       runOnUiThread(new Runnable(){ 
        @Override 
        public void run(){ 
         tv1.setText(location.getLatitude()); 
         tv2.setText(location.getLongitude()); 
        } 
       }); 
      } 
     }; 
} 
+0

Извините, я не вижу способа добавить код здесь, поэтому я вставляю его здесь напрямую. – user264953

+0

final MyLocation myLocation = new MyLocation(); \t \t окончательный LocationResult locationResult = новый LocationResult() { \t \t \t \t \t \t @Override \t \t \t общественного недействительными gotLocation (Место нахождения) { \t \t \t \t // TODO Auto-генерироваться метод заглушки \t \t \t \t \t \t \t} \t \t}; \t \t \t \t btn.setOnClickListener (новый OnClickListener() { \t \t \t @Override \t \t \t общественного недействительными OnClick (View V) { \t \t \t \t myLocation.getLocation (LocationServices.this, locationResult); \t \t \t \t tv1.setText ("широта"); // необходимо добавить широту, я получаю здесь \t \t \t \t tv2.setText ("долгота"); // нужно добавить долготу я сюда \t \t \t} \t \t}); – user264953

+0

Я сделал согласно вашему предложению, но как я могу получить loc.getlat() и loc.getlon(), чтобы установить значения в textview, которые у меня есть ... также, перед установкой этих значений, я не хочу, чтобы пользователь для выполнения каких-либо других действий внутри деятельности..так, чтобы заблокировать его от этого и отобразить другие компоненты в фоновом режиме, в то время как lat, long is fetched, я должен использовать spinner, rt? – user264953

1

Я нашел все примеры довольно запутанной является новым для программирования Android, в конце концов ... самый простой был тот, который работал, так что этот ответ основан на комментарий выше, что имеет код вставлен в это, но я приложил всю свою деятельность, которая работает .. в том, что метки обновляются с указанием местоположения после нажатия кнопки. Думал, что это облегчает чью-то жизнь. О, и убедитесь, что вы используете класс MyLocation, как указано выше.

package com.benderapp; 

import android.app.Activity; 
import android.location.Location; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

import com.benderapp.MyLocation.LocationResult; 

public class DefaultActivity extends Activity { 
    MyLocation myLocation = new MyLocation(); 
    TextView tv1, tv2; 
    Button btn; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     tv1 = (TextView)findViewById(R.id.tv1); 
     tv2 = (TextView)findViewById(R.id.tv2); 
    btn = (Button)findViewById(R.id.Button01); 

    final MyLocation myLocation = new MyLocation(); 
     final LocationResult locationResult = new LocationResult() { 

      @Override 
      public void gotLocation(Location location) { 
        // TODO Auto-generated method stub 
        tv1.setText(location.getLatitude() + "");//need to add latitude i get here 
        tv2.setText(location.getLongitude() + "");//need to add longitude i get here      
      } 
    }; 


    btn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        myLocation.getLocation(DefaultActivity.this,locationResult); 
      } 
     });  
    } 
} 
Смежные вопросы