2016-09-22 4 views
-3

I Googledしかしこれは間違いありません。 今のところ、私はInner AsyncTaskクラスを持っています。私は上位クラスの戻り値を使いたいと思っています。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()を入れている原因、それは成功し、仕事とそれが私の値を示し、ここに私のコードですライン:

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

それは私logcatで配列サイズの正しいint型数を返しますが、私は私のアプリでそれを使用したい、 私はdoInBackgroundメソッドでもすべてのものを行い、さらにstaticという変数を作成します。 チャンスはありません。 誰かが自分のコードで実際のサンプルを与えることができますか? Thx

+0

'onPostExecute'の中で関数を呼び出し、それにmyLatLngs.size()を渡してから、これまで何をしようとしています。 – Alamri

+0

私はそれをしなかった、まったく、私は配列全体を渡す、私は全体の配列が必要な原因。 私はbu setContacts(ArrayListOfContactModel)を実行し、次にonCreateで呼び出されました:consume.getContacts(); 運がありません。 –

+0

もしあなたがmyLatLngs.size()を使う予定があるのであれば? – Alamri

答えて

0

Thxをすべて行うことができます。 Thx、私は本当に問題が何であるのか理解できず、この単純な質問をしました。残念ながら誰もそれに気づいていません。コードの後 :

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

コンパイラは、あまりにも、次のコードを実行する(consume.execute原因)別のスレッドを起動するが、メインスレッドが継続に進みます。 原因は私が遅れて欲しい値を受け取ったので、問題は値を取得する方法ですが、 しかし、実際には問題は私がスレッド非同期を処理できなかったことでした。 私はonPreonPostのAsyncTaskクラスのメソッドをすべて動かしました。

0

まず、非静的な内部クラスの代わりに静的な内部クラスを使用して、非静的な内部クラスが外部クラスへの参照を保持するのでメモリリークを回避する必要があると言います。もう一つは、あなたはそれが

mActivity.response(latLngs); 

そして、あなたの中になりますあなたの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()から値を返すことができるようにあなたが外親クラスのWeakReferenceを渡すことができるということです他のクラスは、それが

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

更新のようになります:Hereは、WeakReference of Activityを内部クラスまたは匿名クラスに渡して使用する方法です。

+0

activity.response(latLngs)とは何ですか? ここの活動は何ですか? –

+0

@T_OそのWeakReferenceインスタンス! –

+0

@T_O擬似コードを更新しました! –

0

AsyncTaskクラスが内部クラスである限り、外部クラスのオブジェクトに直接アクセスできます。

外部のクラスレベルで以下のオブジェクトを作成します。

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

そして、内部オブジェクトクラスから同じオブジェクトインスタンスを削除します。

もう1つの方法は、内側の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(); 

そして、あなたの内側には、バック外部クラスにデータを渡すコンストラクタストアのコールバックを消費します。

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

そしてリンクの下から、あなたはすべての応答のために、

if (mCallback != null) { 
    mCallback.processingDone(myLatLngs); 
} 
Log.e("SizeOfArray", myLatLngs.size()+""); 
関連する問題