2016-09-22 83 views
-3

I Googled很多,但没有这个机会。 现在,我有一个Inner AsyncTask类,我想使用上层类中的返回值。 它成功地工作,因为我已经把Log.e(),它显示了自己的价值,这是我的代码:从void AsyncTask返回ArrayList

public class Consume extends AsyncTask<Void, Void, Void> { 
     private List<LatLng> latLngs = new ArrayList<>(); 
     private List<ContactModel> contacts = new ArrayList<>(); 
     InputStream inputStream = null; 
     String result = ""; 

     @Override 
     protected Void doInBackground(Void... params) { 

      String URL = "http://x.x.x.x/MYWCF/Service1.svc/Json/getContact"; 
      ArrayList<NameValuePair> param = new ArrayList<NameValuePair>(); 
      try { 
       HttpClient httpClient = new DefaultHttpClient(); 
       HttpPost post = new HttpPost(URL); 
       post.setEntity(new UrlEncodedFormEntity(param)); 
       HttpResponse httpResponse = httpClient.execute(post); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       inputStream = httpEntity.getContent(); 

      } catch (UnsupportedEncodingException e1) { 
       Log.e("UnsupportedEncoding", e1.toString()); 
       e1.printStackTrace(); 
      } catch (ClientProtocolException e2) { 
       Log.e("ClientProtocolException", e2.toString()); 
       e2.printStackTrace(); 
      } catch (IllegalStateException e3) { 
       Log.e("IllegalStateException", e3.toString()); 
       e3.printStackTrace(); 
      } catch (IOException e4) { 
       Log.e("IOException", e4.toString()); 
       e4.printStackTrace(); 
      } 
      try { 
       BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
       StringBuilder sBuilder = new StringBuilder(); 

       String line = null; 
       while ((line = bReader.readLine()) != null) { 
        sBuilder.append(line + "\n"); 
       } 
       inputStream.close(); 
       result = sBuilder.toString(); 
      } catch (Exception e) { 
       Log.e("StringBuilding", "Error converting result " + e.toString()); 
      } 
      return null; 
     } 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      List<ContactModel> contactModels; 
      List<LatLng> myLatLngs = new ArrayList<>(); 
      try { 

       JSONObject object = new JSONObject(result); 
       JSONArray jArray = object.getJSONArray("getContactResult"); 

       Type listType = new TypeToken<List<ContactModel>>() { 
       }.getType(); 
       contactModels = new Gson().fromJson(String.valueOf(jArray), listType); 
       setContacts(contactModels); 

       setContacts(contactModels); 
       for(ContactModel contactModel : contactModels) { 
        Double latitude = Double.valueOf(contactModel.getLatitude()); 
        Double longitude = Double.valueOf(contactModel.getLongitude()); 
        LatLng latLong = new LatLng(latitude, longitude); 
        myLatLngs.add(latLong); 
       } 
       setLatLngs(myLatLngs); 
       Log.e("SizeOfArray", myLatLngs.size()+""); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 

    public void setContacts(List<ContactModel> contacts) { 
     this.contacts = contacts; 
    } 

    public List<ContactModel> getContacts() { 
     return contacts; 
    } 

    public void setLatLngs(List<LatLng> latLngs) { 
     this.latLngs = latLngs; 
    } 
    public List<LatLng> getLatLngs() { 
     return latLngs; 
    } 

在我Activity Class

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.osmdroid_map); 


    Consume consume = new Consume(); 
    consume.execute(); 

当我运行该应用程序,原因行:

   Log.e("SizeOfArray", myLatLngs.size()+""); 

它返回我数组大小的正确INT数logcat,但我想用在我的应用程序, 我甚至在doInBackground方法里做了所有的东西,甚至做了一个static变量, 没机会。 任何人都可以通过我的代码提供真实样本吗? Thx

+0

在'onPostExecute'中调用一个函数并将myLatLngs.size()传递给它,然后执行你打算做的任何事情。 – Alamri

+0

我做到了这一点,没有机会,我传递了整个数组,因为我需要整个数组。 我做了set setContacts(ArrayListOfContactModel),然后在我的onCreate中调用如下:consume.getContacts(); 没有运气。 –

+0

如果我可能会问你打算在myLatLngs.size()中使用什么? – Alamri

回答

0

THX一切,为了一切的答复。 Thx,我真的不明白问题是什么,并且是因为我问了这个简单的问题!不幸的是你们没有人注意到这一点。 代码后:

Consume consume = new Consume(); 
consume.execute(): 

编译器去太执行下一个代码,原因consume.execute()启动另一个线程,但主线程继续。 原因是我收到我想要的延迟值,因此我虽然问题是如何获得值,但实际上问题是我无法处理线程异步。 所以我把它们全部移到了onPreonPost方法的AsyncTask类,然后它就起作用了!

0

首先,我会说你应该使用静态内部类而不是非静态内部类来避免内存泄漏,因为非静态内部类保存对外部类的引用。另一件事是,你可以通过外父类的WeakReference这样就可以从的AsyncTask的onPostExecute()返回值一样

public static class Consume extends AsyncTask<Void, Void, Void> { 

    WeakReference<MainActivity> mActivity; 

    public Consume(MainActivity activity){ 
     mActivity = new WeakReference<SampleActivity>(activity); 
    } 
} 

在你的AsyncTask的onPostExecute方法,这将是

mActivity.response(latLngs); 

而在你的其他类就会像

private static void response(List<LatLng> latLngs){ 
    // handle response here in your outer class 
} 

更新Here是如何将活动的WeakReference传递给Inner或Anonymous类并使用它。

+0

你是什么意思的activity.response(latLngs); 这里有什么活动? –

+0

@T_O它的WeakReference实例! –

+0

@T_O我更新了我的伪代码! –

0

只要你的AsyncTask类是一个内部类。它可以直接访问外部类的对象。

在您的外部级别级别创建以下对象。

List<LatLng> myLatLngs = new ArrayList<>(); 

并从内部类相同,这样一个对象实例将是他们的。

另一种方法是使用内部asyntask的回调函数,您需要将接口回调函数传递给外部类以开始进一步处理。

interface CallBack { 
    public void processingDone(); 
} 

Consume consume = new Consume(new CallBack() { 
    @Override 
    public void processingDone(List<LatLng> mLatLngs) { 
    // Do your stuff here 
    } 
}); 
consume.execute(); 

并且在你的Consume构造函数存储区回调函数中将数据传回给外部类。

class Consume { 
    private Callback mCallback; 
    public Consume(Callback callback) { 
    mCallback = callback; 
    } 
} 

而且从下面的链接,你可以做

if (mCallback != null) { 
    mCallback.processingDone(myLatLngs); 
} 
Log.e("SizeOfArray", myLatLngs.size()+"");