2016-04-09 2 views
-2

AsyncTaskを実行するクラスがあり、正常に動作しており、mainActivityにデータを渡すことができます。今私はMainActivityの他の場所でこのデータを処理する方法を知らないという問題があります。スニペット(マーカー)でこのデータを使用してマーカーに情報を入れたいとします:他のクラスのスニペット内でdoInBackgroundデータを渡すにはどうすればよいですか?

AsyncTaskクラス。

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

    URL url; 

    @Override 
    protected String doInBackground(String... params) { 
     HttpURLConnection urlConnection = null; 
     StringBuilder result = null; 
     String duration = ""; 
     String distance = ""; 

     try { 
      url = new URL(params[0]); 
     }catch (MalformedURLException m){ 

     } 

     try { 
      urlConnection = (HttpURLConnection) url.openConnection(); 
     }catch (IOException e){ 

     } 

     try { 
      InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
      result = new StringBuilder(); 
      String line; 
      while((line = reader.readLine()) != null) { 
       result.append(line); 
      } 
     }catch (IOException e){ 

     } finally { 
      urlConnection.disconnect(); 
     } 

     try { 

      JSONObject jsonObject = new JSONObject(result.toString()); 
      JSONArray jsonArray = jsonObject.getJSONArray("rows"); 
      JSONObject object_rows = jsonArray.getJSONObject(0); 
      JSONArray jsonArrayElements = object_rows.getJSONArray("elements"); 
      JSONObject object_elements = jsonArrayElements.getJSONObject(0); 
      JSONObject object_duration = object_elements.getJSONObject("duration"); 
      JSONObject object_distance = object_elements.getJSONObject("distance"); 

      duration = object_duration.getString("text"); 
      distance = object_distance.getString("text"); 

      return distance + ", " + duration + " Driving"; 

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

     return null; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     MainActivity mp = new MainActivity(); 
     mp.getDataFromAsyncTask(s); 
    } 
} 

これは断片である、私は私のMainActivityでデータを取得する方法であって、

public void getDataFromAsyncTask(String result) { 
     getDistanceAndTime = result + km; 
    } 

そして、私はここに、このデータを使用したい:

mMap.addMarker(new MarkerOptions().position(new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude())) 
           .title(name.getName()) 
           .snippet(getDistanceAndTime)//here is where I want to put the data that I get in getDataFromAsyncTask 
           .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))); 

これはということです私は試していますが、データがありません:

私はgetDataFromAsyncTaskで使用しているグローバル変数をm yのスニペットが、彼は最初のinicializationのデータを取る:あなたの活動を自分でインスタンス化されているonPostExecute方法で

String getDistanceAndTime 

public void getDataFromAsyncTask(String result) { 
      getDistanceAndTime = result + km; 
     } 

    mMap.addMarker(new MarkerOptions().position(new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude())) 
            .title(name.getName()) 
            .snippet(getDistanceAndTime)//here is where I want to put the data that I get in getDataFromAsyncTask 
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))); 

答えて

1

これは、このようなシナリオ(クラス間の通信)を処理するときに行うことです。できるだけデカップリングされたコードを作成してください。そのことを念頭に置いて、イベントが行われます!

  • 変数(boolean isCompletedおよびマーカーを更新する必要がある値 - AsyncTaskから取得)を使用してイベントクラス(Plain Old Java Object POJO)を作成します。あなたのコンストラクタはonPostExecute内でこれらの変数を設定するための値を取る必要があります。ここでイベントの活動を通知します。 EventBus.getDefault().post(new EventClassName(true, value));
  • イベントライブラリの使用 - 私のお気に入りはEventBusで、AsyncTaskのonPostExecute()メソッドの中で、新しい値をアクティビティに戻すことができます。
  • アクティビティは、手順1で作成したイベントに登録(登録)する必要があります。EventBus.getDefault().register(this)
  • また、アクティビティまたはフラグメントのonDestroy内で登録を解除する必要があります。
  • は今、最終的に、あなたがあなたの活動に次のシグネチャを持つメソッドを追加する必要があります - onPostExecute(からポストされたイベントをキャッチします)、このように見なければならないこの方法:この方法インサイドpublic void onEvent(EventClassName event)
  • は、あなたが呼び出す必要があります必要に応じてマーカーを更新するか、直接更新します。

がEventBusライブラリを使用するには、単にあなたのbuild.gradleにこれを追加するには、あなたが行くことは良いことがあり

compile 'org.greenrobot:eventbus:3.0.0' 

の依存性を!幸運と幸せなコーディング。

0

、それだけで目的を達成しません、活動はシステムによってインスタンス化されます。 MainActivityからAsyncTaskを呼び出す場合は、その参照を渡してから、その参照を使用してメソッドを呼び出します。ここにあなたのコードについての誤解があります

0

:アンドロイドで

MainActivity mp = new MainActivity(); 
mp.getDataFromAsyncTask(s); 

が、あなたは活動のオブジェクトのインスタンスを作成しないでください。 Androidは、アクティビティを開始すると、あなたのためにそれらを作成します。

文字列などのデータをアクティビティに渡すには、そのデータをアクティビティを開始するインテントに配置し、アクティビティのonCreate()中にインテントからそのデータを引き出します。これはAndroidの最も基本的な方法の1つで、the documentation for that is hereです。

関連する問題