2016-12-15 97 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