Мне нужно ускорить процесс получения контента и управления флагом из типа javaMail.Message - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь решить эту проблему так долго. В первый раз я получил javaMail.Message. Я вытащил содержимое почтового сообщения и другие вещи в RecyclerView.Adapter -> OnBindViewHolder. Но когда я вынимаю контент и управляю флагом, это занимает так много времени. это главная страница

val props = Properties()
            props.setProperty("mail.debug", "true")
            props.setProperty("mail.imap.port", "143")
            props.setProperty("mail.imap.ssl.enable", "true")
            props.setProperty("mail.imap.socketFactory.port", "993")
            val session = Session.getDefaultInstance(props, authenticator(mailBox.user, mailBox.pass))
            val store = session.getStore("imaps")
            store.connect(mailBox.mailHost,mailBox.user,mailBox.pass)
            val fetchProfile = FetchProfile()
            fetchProfile.add(FetchProfile.Item.CONTENT_INFO)
            fetchProfile.add(FetchProfile.Item.ENVELOPE)
            val emailFolder = store.getFolder("Inbox")
            emailFolder.open(Folder.READ_WRITE)
            val messages: Array<Message> = emailFolder.messages
            emailFolder.fetch(messages,fetchProfile)
            activityUiThread {
                val adapter = testAdapter(this@MailBox,messages,this@MailBox)
                allMail_recycler.adapter = adapter
                dialog.dismiss()
            }

это адаптер

override fun onBindViewHolder(holder : ViewHolder, position: Int) = runBlocking{
    val message = receiveMessage[position]
        /** visibility **/
       // holder.itemView.d3p.visibility = INVISIBLE
        holder.itemView.imV_attach.visibility = INVISIBLE
        /** unChangeable **/
            val bworker = GlobalScope.launch {
            val from = message.from[0].toString().split("<")[0]
            val sentDate= message.receivedDate
            val subject = message.subject
            val content = message.content.toString()
            val recepient = message.allRecipients[0].toString()
            val seen = message.flags.toString()
            val attachent = message.isMimeType("multipart/mixed")
            if (attachent){
                holder.itemView.imV_attach.visibility = VISIBLE
            }
             holder.itemView.mailSender.text = from
             holder.itemView.dateTimeTxt.text = SimpleDateFormat("MMM dd").format(sentDate)
             holder.itemView.subjectTxt.text = subject
             holder.itemView.bodyTxt.text = content
              //  mailBox.data.add(messageModel(from,recepient,subject,content,date,attachent,seen))
            }
            bworker.join()

        holder.itemView.setOnClickListener {
        notifyItemChanged(position)
        eventChange.change(position)
    }
}

это мой проект

проверить это

1 Ответ

1 голос
/ 07 января 2020

Давайте начнем с упрощения вашего кода. Замените эти строки:

        props.setProperty("mail.debug", "true")
        props.setProperty("mail.imap.port", "143")
        props.setProperty("mail.imap.ssl.enable", "true")
        props.setProperty("mail.imap.socketFactory.port", "993")
        val session = Session.getDefaultInstance(props, authenticator(mailBox.user, mailBox.pass))

на эти:

        props.setProperty("mail.debug", "true")
        props.setProperty("mail.imap.ssl.enable", "true")
        val session = Session.getInstance(props)

Это:

        val from = message.from[0].toString().split("<")[0]

, вероятно, хочет выглядеть примерно так:

        val from = (InternetAddress)(message.from[0]).getAddress()

(Не уверен, нужен ли актерский состав.)

Я не знаю, почему вы используете полученные данные в качестве даты отправки, но это неправильно. Почему вы просто не используете дату отправки?

Использование message.content.toString будет работать только для простого простого текстового сообщения. Конечно, любое сообщение с вложением не даст желаемое. См. Раздел часто задаваемых вопросов для найти тело основного сообщения .

Это также объясняет, почему вы не хотите каждый раз удалять весь контент сообщения; это ужасно неэффективно. Вам также может понадобиться изменить программу, чтобы любые вложения загружались только тогда, когда пользователь нажимает на них. Для отладки попробуйте закомментировать доступ к message.content и замените его пустой строкой и посмотрите, приблизилась ли производительность к ожидаемому.

Если вы все еще не получаете желаемую производительность, Вы должны посмотреть на другие элементы FetchProfile, которые вы можете использовать. Вы также должны опубликовать выходные данные отладки JavaMail, в идеале с отметкой времени для каждой строки, или с выводом из вашей программы, показывающим System.currentTimeMillis () вокруг каждого из ключевых операторов в вашей программе.

...