получение ошибки android.os.networkonmainthreadexception при входе в учетную запись электронной почты в методе службы onstartcommand () - PullRequest
0 голосов
/ 18 ноября 2018

Хотите создать фоновый сервис Android, который будет постоянно проверять входящие электронные письма. Я создал действие и есть кнопка запуска и остановки сервиса вместе с некоторыми полями ввода от пользователя. При нажатии кнопки запуска службы я вызываю метод службы onStartCommand () и отправляю необходимые сведения (идентификатор электронной почты, pwd и т. Д.) Из действия в службу через намерение службы. Теперь, когда я должен войти в учетную запись электронной почты в onStartCommand (), я вызвал метод Store.connect (), который вызывает исключение android.os.networkonmainthreadexception. Я искал и обнаружил, что должен выполнить задачи подключения к учетной записи электронной почты в методе doinbackground Asynctask, чтобы основной поток не нарушался. Итак, я сделал то же самое, но даже там я получаю ту же ошибку. Но когда я сделал то же самое в действии, создав асинхронный внутренний класс, он работал нормально, но не в случае обслуживания.

Вот метод onstartcommand ()

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Let it continue running until it is stopped.
        super.onStartCommand(intent, flags, startId);
        String resp = null;


        if(intent !=null && intent.getExtras() != null){
            emailID = intent.getExtras().getString("email");
            pwd =  intent.getExtras().getString("pwd");
            urlServer = intent.getExtras().getString("urlServer");
            from_whom = intent.getExtras().getString("from_whom");

            AsyncTaskRunner runner = new AsyncTaskRunner();
            //runner.execute(emailID, pwd, urlServer);
            resp = runner.doInBackground(emailID, pwd, urlServer);
        }
        if ((resp.equalsIgnoreCase("yes")))
        {
            startTimer();
            Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        }



        return START_STICKY;

и приватный внутренний класс asynctask

private class AsyncTaskRunner extends AsyncTask<String, String, String> {

        private String resp;

        @Override
        protected String doInBackground(String... params) {

            try {

                //emailManager = new EmailManager(params[0], params[1], params[2], "smtp.gmail.com", "imap.gmail.com");
                emailManager = new EmailManager("test2891test", "Testing2891!", "gmail.com", "smtp.gmail.com", "imap.gmail.com");
                Message[] emails = emailManager.getMails();
                Message latest_email = emails[emails.length -1]; // latest email
                email_from = InternetAddress.toString(latest_email.getFrom());
                email_sub = latest_email.getSubject();

                Multipart mp = (Multipart) latest_email.getContent();

получение ошибки android.os.networkonmainthreadexception в методе emailmanager.getmails () для store.connect ():

public Message[] getMails() throws MessagingException {
        store = imapSession.getStore("imaps");
        store.connect(mailServer, account.emailAddress, account.password);
        inbox = store.getFolder("Inbox");
        inbox.open(Folder.READ_ONLY);
        Message[] result = inbox.getMessages();

        return result;
    }

ЕСЛИ Я ВСЕ ДЕЛАЮ ВСЕ ЭТИ ASYNCTASK В ДЕЯТЕЛЬНОСТИ, ПОТОМУ ЧТО ЭТО РАБОТАЕТ, ТОЛЬКО УВЕЛИЧИТЬ ОШИБКУ В СЛУЧАЕ ОБСЛУЖИВАНИЯ.

ЛЮБАЯ ПОМОЩЬ БУДЕТ ХОРОШО оценена.

СПАСИБО

1 Ответ

0 голосов
/ 19 ноября 2018

Я неправильно вызываю асинхронную задачу, которая описана здесь https://stackoverflow.com/a/22440804/7361890, теперь я обнаружил ошибку основного потока.

...