2016-12-15 11 views
0

私はAndroidプロジェクトで作業しています。ここに私の問題を知るために必要なものがあります。 (十分でない場合は教えてください):インターフェイスコールバックメソッドが呼び出されていませんか?

私はフラグメント、非同期タスク、および非同期応答という名前のインターフェイスを持っています。非同期タスクは独自のクラスに存在し、DownLoadRawDataと呼ばれます。ここでフラグメントのコードは次のとおりです。

public class RedditListFragment extends Fragment implements AsyncResponse{ 


    private RecyclerView mRecyclerView; 
    private RedditAdapter mAdapter; 
    private Parser parse; 





@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_reddit_list, container, false); 
      mRecyclerView = (RecyclerView) view.findViewById(R.id.reddit_list_view); 
      mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 





     executeAsyncTask(); 





    updateUI(); 
    // Inflate the layout for this fragment 
    return view; 
} 


**@Override 
public void processFinish(String output) { 
    parse = new Parser(output); 
    Log.d("TAG", "The List to STring is " + parse.getRedditObjectList().toString()); 
    Log.d("TAG", "process finished reached"); 
}** 

public void executeAsyncTask(){ 
    DownLoadRawData downLoadRawData = new DownLoadRawData(); 
    downLoadRawData.delegate = this; 
    downLoadRawData.execute("https://www.reddit.com/r/Showerthoughts/.json"); 


    // Log.d("ERR", " TEXT WAS " + jsonTEXT); 
} 






public void updateUI(){ 
     List<RedditObject> listOfRedditObject = parse.getRedditObjectList(); 

     mAdapter = new RedditAdapter(listOfRedditObject); 
     mRecyclerView.setAdapter(mAdapter); 

} 




private class RedditHolder extends RecyclerView.ViewHolder{ 


    private TextView mTextView; 


    public RedditHolder(View itemView) { 
     super(itemView); 

     mTextView = (TextView) itemView; //by casting itemView to a TextView, this forces client to pass text view 
    } 

} 


private class RedditAdapter extends RecyclerView.Adapter<RedditHolder>{ 


    private List<RedditObject> mListOfRedditObjects; 



    public RedditAdapter(List<RedditObject> listOfRedditObject){ 
     mListOfRedditObjects = listOfRedditObject; 
    } 

    @Override 
    public RedditHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     LayoutInflater layoutInflater = LayoutInflater.from(getActivity()); 
     View view = layoutInflater.inflate(R.layout.single_reddit_listing, parent, false); 
     return new RedditHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(RedditHolder holder, int position) { 
      RedditObject redditObject = mListOfRedditObjects.get(position); 
      holder.mTextView.setText(redditObject.getmTitle()); 
    } 

    @Override 
    public int getItemCount() { 
     return mListOfRedditObjects.size(); 
    } 
} 

}

DownloadRawData非同期Taskクラスはここにある:

package com.example.ridhwaan.redditforfaez; 

    import android.os.AsyncTask; 
    import android.util.Log; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.InputStreamReader; 
    import java.net.HttpURLConnection; 
    import java.net.URL; 


public class DownLoadRawData extends AsyncTask<String, Void, String> { 
    private String mFileContents; 
    **public AsyncResponse delegate = null;** 




public String getmFileContents() { 
    return mFileContents; 
} 

@Override 
protected String doInBackground(String... strings) { 
    mFileContents = downloadRawJSON(strings[0]); 

    return mFileContents; 
} 

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    **delegate.processFinish(result);** 
    Log.d("TAG", "RESULT" + result); 


} 

そしてAync応答:

public interface AsyncResponse { 

void processFinish(String output); 

}

Fo何らかの理由で、私のフラグメントクラスでは、プロセス終了メソッドが呼び出されていません。私の理解から、Async Responseは、パラメータが与えられたDownLoadRawデータクラスで実装されています。次に、デリゲートをフラグメントクラスに設定して、メソッドの結果を返すか、コールバックする準備ができます。その欠陥があれば私の理解で私を助けてください。

問題は、プロセス終了メソッドがまったく呼び出されていないことです。私が入れたログはプリントアウトされていませんが、どこにでもプリントアウトされています。

この問題の原因は何ですか?すべての

答えて

0

はい、それはonPostExecutedが呼び出された場合にログに印刷する必要があります。呼び出された場合はonPostExecutedのログを確認してください。

+0

ログがOnPostExecuteであると、 – Ridhwaan

+0

が表示されないようです。「DownLoadRawData」タスクが実行されていない可能性があります。コマンド 'new DownLoadRawData()。executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);で実行しようとしました。 ' – hyperloop

+0

スレッドプールは、同時実行機能を利用するコードを変更しない限り、少し過剰な/非効率的です。彼はただ一つのスレッドを実行しようとしているように見えます。その場合、単純なスレッド+コールバックが簡単な答えかもしれません。 – mawalker

0

まず

おかげで、あなたが代わりにあなたの活動と呼ばれるものも持っている必要があり、その活動は、すべての変更の断片を通知してきました。そのインタフェースを介して、アクティビティにフラグメントへの参照を格納させます。

Model View Presenter patternは、フラグメントと同時実行性を扱う際に多くの面で役立ちます。 (ちょっと役立つヒント)

あなたの質問に答えるには、onPostExecute()でSuper()を呼び出す必要はありません。その時点で実行を中止する可能性が最も高いです。その行を削除すれば、おそらく大丈夫でしょう。

(あなたが完全なコードを示さなかったので、あなたの**擬似コード**行は、実際に、仕事と仮定)

+0

私のOnPostExecuteが実行されていないようです。メソッド内のLogは実行されません。どのようにして問題を解決できますか? – Ridhwaan

+0

AHH ...私はこれに一度遭遇しました...テスト中にあなたの携帯電話を回していますか?これは、フラグメント&アクティビティとasyncTaskの間の切断を引き起こすためです。 doInBackgroundをログに記録し、いくつかの操作がすべて動作し続けるかどうかを確認します。 doInBackgroundが最初に完了しているかどうかを確認してから、@ onPostExecuteを心配してください。例外が発生している可能性があります。 しかし、FYIのように、headlessフラグメントは、asyncTaskとrotation/etcの両方を保存する方法を発見したものです。 – mawalker

+0

https://github.com/douglascraigschmidt/LiveLessons/blob/079b30981156fca1001edfd8f73c8fcf99b4c290/ImageTaskGangApplication/src/example/imagetaskgang/MainActivityjava#L48は、AndroidでのHaMeRフレームワークの例です(Doug&Iはその名前をDougと呼んでいます)。これは、バックグラウンドで実行される単一のスレッドを実行するもっと簡単な方法を示しています。これはAsyncTaskよりも明白かもしれません。しかし、あなたのネットワークコールが実際に実行され、適切に処理されているかどうかを確認する必要があります。 – mawalker

関連する問題