我正在使用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