我正在使用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數據類中實現的。然後我們在片段類中爲此設置一個委託,以便可以準備好返回方法結果或回調。如果有缺陷,請幫助我瞭解我的理解。
問題是進程完成方法根本沒有被調用。我放入的日誌沒有被打印出來,但是它們在其他地方被打印出來。
這個問題的原因是什麼?
感謝
The Log is OnPostExecute似乎無法打印 – Ridhwaan
也許'DownLoadRawData'任務未運行。嘗試通過命令'new DownLoadRawData()。executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); ' – hyperloop
線程池有點過度/效率低下,除非他修改他的代碼以利用併發功能。因爲它看起來像他只是試圖運行一個單一的線程。如果是這樣的話,簡單的線程+回調可能是更簡單的答案。 – mawalker