2011-03-09 61 views
0

我有一個連接到互聯網的android應用程序,可以實時對經緯度和長座標進行反向地理編碼。這延遲了用戶界面,並可能導致它給出「沒有響應 - 強制關閉/等待」錯誤(正如所料,不使用異步/線程處理程序!)Android onLocationChanged(位置loc)&ASync任務問題

我已經實現了一個異步任務,工作得很好UI滯後!),但在onLocationChanged方法中設置的變量(將它們設置爲緯度&經度)是無法訪問的。 我正在這樣做的課程與另一個能夠傳遞變量的獨立課程相關聯,並且可以將短信發送給包含反向地理編碼地址的人。 但是,自從使用doinbackground方法實現異步任務以來,我無法再發送我需要的東西。我不知道我能否更好地解釋,我會提供示例代碼。

public void onLocationChanged(Location loc){myLow = loc.getLatitude(); mylong = loc.getLongitude(); }

列表地址= geoCoder.getFromLocation(mylat,mylong,1); // afaik,這是互聯網的代碼,這滯後於用戶界面。如果我把它放在doinbackground中,它就不能訪問mylong &我的長時間,並且「loc.getLatitude」必須在需要存在的「onLocationChanged」方法中完成。如果我將ListAddress代碼放在doinbackground之外,一切都可以正常工作,但UI顯然會滯後。

任何人都可以建議獲取mylat = loc.getLatitude(); & mylat = loc.getLatitude();在doinbackground方法裏面?

回答

3
  1. 覆蓋你的AsyncTask的構造函數,並設置mylatmylong作爲變量在該類
  2. 或者他們直接傳遞給doInBackground方法。

    ... extends AsyncTask<Double, ProgressType, ReturnType> { 
        protected ReturnType doInBackground(Double... params) { 
         mylat = params[0]; 
         mylong = params[1]; 
         List addresses = geoCoder.getFromLocation(mylat, mylong, 1); 
         ... 
        } 
        ... 
    } 
    

    execute(mylat, mylong);

+0

我試過了。有錯誤。儘管這聽起來可行。這是我的代碼。(mylat和mylong是全局聲明的,並且有兩種獨立的get方法,所以發送短消息的其他類可以獲得它們)http://pastebin.com/9b8Q3mFc – GrumP

+0

我在哪裏調用execute? – GrumP

+1

你的AsyncTask應該是另一個類,不要在你的主類中繼承它。內部類的示例:http://pastebin.com/2F0NEbUh – red

1

您可以通過mylatmylong作爲參數來覆蓋AsyncTask類的構造函數。在構造函數中,將參數保存爲AsyncTask的成員變量。這樣做,你應該可以在doInBackground()方法中訪問它們。

另一件事,你應該考慮一下,如果你真的需要一個位置監聽器。也許LocationManager及其方法getLastKnownLocation()也可以完成這項工作,如果你只在特定時刻需要當前位置。然後,您還可以確定doInBackground()方法中的當前位置。但請仔細閱讀getLastKnownLocation()的文件,如果它確實符合您的需求。如果每次設備移動時都需要更新,則必須使用位置偵聽器。

+0

感謝弗洛稱呼它,是的,我確實需要的位置監聽器。異步任務很好,但是因爲發送短消息地址的類不能看到mylat = loc.getLatitude(); (這是特殊的必需方法onLocationChanged),sms類似乎只能看到全局空mylat/mylong變量,因此當從主類調用mylat/mylong的get方法時無法解析地址。 – GrumP