2015-07-09 4 views
-3

Я использую метод doInBackground получить JSON из веб-службы, так что я могу использовать его в своей основной деятельности, вот что я сделал, но он не работаетвозвращение к деятельности JSON по AsyncTask

public class JSONTransmitter extends AsyncTask<JSONObject, JSONObject, JSONObject> { 
@Override 
protected JSONObject doInBackground(JSONObject... data) { 
//.....  
    return json; 
} 

@Override 
protected void onPostExecute(JSONObject jsonObject) { 
    super.onPostExecute(jsonObject); 

} 
} 

и вот моя основная деятельность

public void sync(View v){ 
    LocationsDB mLocationsDB = new LocationsDB(SupportMapActivity.this); 
    Cursor events= mLocationsDB.getAllLocations(); 

    try { 
     JSONObject json=makJsonObject(events); 
     JSONTransmitter transmitter = new JSONTransmitter(); 
     AsyncTask<JSONObject, JSONObject, JSONObject> jsonRetour = transmitter.execute(new JSONObject[]{json}); 
//I want to use it here like jsonRetour.getString("something"); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 
+0

AsyncTask является асинхронным. Вы вернете результат в onPostExecute(). – BladeCoder

+0

Возможный дубликат [android asynctask отправки обратных вызовов в ui] (http://stackoverflow.com/questions/9963691/android-asynctask-sending-callbacks-to-ui) Либо используйте интерфейс для включения обратного вызова в свою активность, либо просто сделайте AsyncTask внутренним классом Activity. –

ответ

0

Существует несколько способов сделать это, но один из моих любимых способов - это интерфейс обратного вызова.

Здесь JSONTransmitter:

public class JSONTransmitter extends AsyncTask<JSONObject, JSONObject, JSONObject> { 

    private OnJsonTransmitionCompleted mCallback; 

    public JSONTransmitter(OnJsonTransmitionCompleted callback) { 
     this.mCallback = callback; 
    } 

    @Override 
    protected JSONObject doInBackground(JSONObject... data) { 
     //.....  
     return json; 
    } 

    @Override 
    protected void onPostExecute(JSONObject jsonObject) { 
     super.onPostExecute(jsonObject); 
     this.mCallback.onTransmitionCompleted(jsonObject); 
    } 

    public interface OnJsonTransmitionCompleted { 
     void onTransmitionCompleted(JSONObject jsonObject); 
    } 
} 

Обратный вызов интерфейса OnJsonTransmitionCompleted находится внутри JSONTrasnmitter, как единственное его использование с JSONTransmitter.

Вот основной вид деятельности:

public class SupportMapActivity extends Activity implements JSONTransmitter.OnJsonTransmitionCompleted{ 

    public void sync(View v){ 
     LocationsDB mLocationsDB = new LocationsDB(SupportMapActivity.this); 
     Cursor events= mLocationsDB.getAllLocations(); 

     try { 
      JSONObject json = makJsonObject(events); 
      JSONTransmitter transmitter = new JSONTransmitter(this); 
      transmitter.execute(new JSONObject[]{json}); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onTransmitionCompleted(JSONObject jsonObject) { 
     // Now you have access to your JSON data in your activity! 
    } 
} 

Таким образом, мы создаем интерфейс обратного вызова внутри JSONTransmitter, который имеет один метод void onTransmitionCompleted(JSONObject jsonObject), который будет проходить в JSONObject вашей деятельности от onPostExecute(JSONObject jsonObject).

Внутри основной деятельности мы реализуем JSONTransmitter.OnJsonTransmitionCompleted и передать в this, когда мы создаем JSONTransmitter и, наконец, мы Override void onTransmitionCompleted(JSONObject jsonObject) внутри деятельности и как только наш AsyncTask закончил свой фоновый процесс и onPostExecute(JSONObject jsonObject) был назван мы получим JSONObject внутри реализованного метода onTransmitionCompleted(JSONObject jsonObject).

Я надеюсь, что это помогает здесь несколько ссылок на эту тему:

android asynctask sending callbacks to ui

http://android-er.blogspot.co.il/2013/09/implement-callback-function-with.html

http://blog.redkitmedia.com/android-asynctask-sending-callbacks-to-ui/

http://android-dwivediji.blogspot.co.il/2014/01/best-way-to-use-asynctask-class.html

+0

большое спасибо ^^ –

0

в JSONTransmitter, что вам нужно сделать что-то с объектом JSON в onPostExecute(). На данный момент ваша задача Async ничего не делает с этим.

Попробуйте это:

В Основной вид деятельности, есть вар JSONObject под названием mJson и в вашем onPostExecute сделать это:

protected void onPostExecute(JSONObject jsonObject) { 
    super.onPostExecute(jsonObject); 
    mJson = jsonObject; 
    // call a method from the MainActivity to do whatever needs to be done with the JSON 
} 

Конечно, чтобы это работало, AsyncTask должен быть внутренний класс по основной деятельности.