2016-12-15 98 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異步任務類是在這裏:

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由於某種原因,在我的片段類中,進程完成方法沒有被調用。根據我對接口的理解,異步響應是在提供參數的DownLoadRaw數據類中實現的。然後我們在片段類中爲此設置一個委託,以便可以準備好返回方法結果或回調。如果有缺陷,請幫助我瞭解我的理解。

問題是進程完成方法根本沒有被調用。我放入的日誌沒有被打印出來,但是它們在其他地方被打印出來。

這個問題的原因是什麼?

感謝

回答

0

是的,它應該打印日誌如果onPostExecuted被調用。如果它被調用,請檢查日誌onPostExecuted

+0

The Log is OnPostExecute似乎無法打印 – Ridhwaan

+0

也許'DownLoadRawData'任務未運行。嘗試通過命令'new DownLoadRawData()。executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); ' – hyperloop

+0

線程池有點過度/效率低下,除非他修改他的代碼以利用併發功能。因爲它看起來像他只是試圖運行一個單一的線程。如果是這樣的話,簡單的線程+回調可能是更簡單的答案。 – mawalker

0

首先,而是應該有你的活動是被稱爲一個,然後有活動通知的任何變化的片段。讓活動通過該界面存儲對片段的引用。

Model View Presenter pattern有助於處理碎片和併發。 (只是一個有用的提示)

但要回答你的問題:你不需要在onPostExecute()中調用Super()。這很可能會停止執行。所以,如果你刪除該行,你可能會沒事的。

(假設你的** **僞代碼行實際工作,因爲你沒有顯示完整的代碼)

+0

看來我的OnPostExecute沒有運行。登錄方法不會執行。我如何解決這個問題? – Ridhwaan

+0

AHH ......我遇到過這個......你在測試過程中旋轉手機嗎?因爲這會導致片段和活動之間以及asyncTask之間的斷開。 你應該做的是記錄你的doInBackground,看看它是否每一個操作都繼續運行。這可能是它崩潰/拋出異常(我認爲當它發生在那裏但是不確定是否被完全拋棄),但是無論如何... ....看看doInBackground是否甚至先完成,然後擔心@ onPostExecute。 但作爲參考,無頭碎片是我們如何發現存儲asyncTask與旋轉/等。 – mawalker

+0

https://github.com/douglascraigschmidt/LiveLessons/blob/079b30981156fca1001edfd8f73c8fcf99b4c290/ImageTaskGangApplication/src/example/imagetaskgang/MainActivity。java#L48這裏是Android中HaMeR框架的一個例子(道格和我把它命名爲這樣(主要是Doug)),它顯示了一個更簡單的方法來執行在後臺運行的單個線程。這可能比AsyncTask更清晰。但是,無論哪種方式,您都需要查看您的網絡呼叫是否實際運行並正確處理。 – mawalker