2016-11-08 8 views
0

ダウンロードの完了を待ち受けるRequestCompleteListenerクラスとともにNetworkConnectorクラスを介してダウンロードプロセスを初期化するフラグメントがあります。フラグメントのコンテキストをインタフェースを介してフラグメント内のメソッドを実行するクラスに渡す

NetworkConnector

のコンストラクタ
public NetworkConnector(Context ctx, String url, String methodType, int downloadId, 
      ArrayList<ArrayList<String>> postData, RequestCompleteListener<String> listener) 

このクラスは、ダウンロードを行い、RequestCompleteListenerという名前のインタフェースを介して、OnRequestExecutedメソッドを実行します。

public class OnRequestComplete implements RequestCompleteListener<String> { 
private DataProcessInterface dataProcessInterface; 

public OnRequestComplete(Context context) { 
    dataProcessInterface = (DataProcessInterface) context; 
} 

@Override 
public void onRequestExecuted(String responseType, String result, int downloadId) { 
    if (!responseType.equals("error")) { 
     dataProcessInterface.processData(result, downloadId); 
    } else { 
     dataProcessInterface.processError(result, downloadId); 
    } 
} 
} 

このフラグメントは、インタフェースDataProcessInterfaceを実装しています。また、OnRequestCompletedメソッドは、インタフェースを使用してフラグメント内のメソッドprocessDataおよびprocessErrorを実行します。

public class FoodListFragment extends Fragment implements DataProcessInterface { 

このプロセスは、アクティビティから実行すると完全に正常に動作します。しかし、これはフラグメントを介して行われたとき、私はClassCastExceptionの代わりに、フラグメントのコンテキストを必要とする?以下。

new NetworkConnector(getActivity(), url, "GET", 101, null, new OnRequestComplete(???)); 

getActivity()view.getContext()は明白な理由のために動作しません。 FoodListFragment.thisを試したところ、エラーOnRequestCompleteは断片ではなくコンテキストを求めています。

だから、???の代わりに何を渡す必要がありますか? ?アクティビティにDataProcessInterfaceインターフェイスを実装し、別のインターフェイスを使用してフラグメント内のデータを表示する必要はありません。

答えて

1

フラグメントはコンテキストではなく、コンテキストを持つ可能性があります。あなたは、OnRequestCompleteインスタンスにコンテキストを渡して、それをDataProcessInterfaceにキャストしようとしています。わかりやすくするために、インターフェースを直接渡すべきでしょう。

public class OnRequestComplete implements RequestCompleteListener<String> { 
    private DataProcessInterface dataProcessInterface; 

    public OnRequestComplete(DataProcessInterface dpi) { 
     dataProcessInterface = context; 
    } 
<....> 
    } 

となりました。

new NetworkConnector(getActivity(), url, "GET", 101, null, new OnRequestComplete(FoodListFragment.this)); 

更新: 注、私はあなたがこのデザインカントーで傷の世界のためにだと思います。コンテキストとフラグメントの両方を漏らすリスクがあります。

関連する問題