【问题标题】:Using an interface inside onScrollListener在 onScrollListener 中使用接口
【发布时间】:2015-10-08 09:55:52
【问题描述】:

我有一个带有 recyclerview 的活动,它在活动开始时列出了 10 封电子邮件(这部分工作正常)。我正在使用 asynctask 通过 javamail API 获取数据。此外,由于 asynctask 位于单独的类中并且没有嵌套,因此我使用了一个接口将 onPostExecude 委托给我的带有 recview 的活动。 但是我还需要实现一个功能,如果我在列表的底部,我会再次使用 asynctask 加载 10 封电子邮件。 (一次只有 10 个,因为加载这些需要时间)当我在侦听器中时,我遇到了 asnyctask 委托部分的问题:

Email_InboxActivity 类:

public class Email_InboxActivity extends AppCompatActivity implements fetchInboxMail_Interface {

private String email, password, providerName, imapHostName;
private boolean isThereMore = true;
private RecyclerView recList;
private LinearLayoutManager llm;
private fetchInboxMail mAsyncTask;
private fetchInboxMail_Interface mInterface;
public ArrayList<Email_Message> loadedEmails = new ArrayList<Email_Message>();
int firstVisibleItem, visibleItemCount, totalItemCount, startIndex = 0, offset = 10;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_email__inbox);
    ...

    //setting up the recyclerview
    recList = (RecyclerView) findViewById(R.id.email_list);
    recList.setHasFixedSize(true);
    llm = new LinearLayoutManager(this);
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    recList.setLayoutManager(llm);

    recList.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            visibleItemCount = llm.getChildCount();
            totalItemCount = llm.getItemCount();
            firstVisibleItem = llm.findFirstVisibleItemPosition();


            if(isThereMore && totalItemCount == (firstVisibleItem + visibleItemCount) && visibleItemCount > 0 ){
                mAsyncTask = new fetchInboxMail(Email_InboxActivity.this, email, password, imapHostName, startIndex, offset);
                mAsyncTask.execute();
                mAsyncTask.delegate = mInterFace //nullpoint exception, and the keyword "this" also not working since this class doesnt implement the interface
            }
        }
    });

    mAsyncTask = new fetchInboxMail(Email_InboxActivity.this, email, password, imapHostName, startIndex, offset);
    mAsyncTask.execute();
    mAsyncTask.delegate = this;
}

...

public void AsyncTaskFinish(ArrayList<Email_Message> EmailInbox){
    loadedEmails.addAll(EmailInbox);
    Email_ListAdapter mAdapter = new Email_ListAdapter(loadedEmails);
    recList.setAdapter(mAdapter);

    startIndex = loadedEmails.size();

    SharedPreferences sharedPref = getSharedPreferences("isthere_more_email", Context.MODE_PRIVATE);
    isThereMore = sharedPref.getBoolean("isthere_more", true);
    if(!isThereMore){
        Toast.makeText(Email_InboxActivity.this, getString(R.string.last_email_toast), Toast.LENGTH_LONG).show();
    }
}
}

界面:

public interface fetchInboxMail_Interface {

void AsyncTaskFinish(ArrayList<Email_Message> EmailInbox);
}

编辑:asynctask onpostexecute 部分:

@Override
protected void onPostExecute(ArrayList<Email_Message> EmailInbox) {
    super.onPostExecute(EmailInbox);

    ...
    delegate.AsyncTaskFinish(EmailInbox);
}

那么解决方案是什么,以便我也可以使用 onScrollListener 中的接口?我想过创建一个扩展 RecyclerView.OnScrollListener() 并实现接口的新类,但问题是我没有该类中需要的字段(loadedEmails、recList、llm)。

如果答案是我需要将 asynctask 用作嵌套类并删除接口,我会非常难过:(

【问题讨论】:

  • 你的问题是什么,你的解决方案看起来应该可以工作,你能发布你的 asynctask 代码吗?
  • 我认为这并不重要,但我想我可以添加 onpostexecute 部分。问题出在评论所在的 onscrolllistener 中。该行目前给出了 nullpointexception。
  • mAsyncTask.execute(); mAsyncTask.delegate = this; 我会交换这两行如果异步任务同步完成,委托将为空
  • 这行不可能抛出空指针,而不是调用任何方法。您不需要存储对自身的引用,如果 mInterface 将始终等于 this 为什么存储它?另外,您在哪里设置它?
  • @eyeballz 它不应该,但无论如何最好防止它,以防万一。

标签: android android-asynctask android-recyclerview


【解决方案1】:

你可以改变这一行:

mAsyncTask.delegate = mInterFace;

mAsyncTask.delegate = Email_InboxActivity.this;

你也可以这样做

mInterface = this;

在 OnCreate 方法中,但无论如何,在您可以使用它的地方存储对自身的引用是没有意义的。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 2020-02-10
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多