Класс AsyncTasck не будет выполняться после вызова метода execute - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть класс для загрузки файла (PortParser) класса.и после установки отладчика внутри метода doInBackground.Я вижу после вызова execute, он переходит на следующую строку в MainActivity вместо того, чтобы заходить в doInBackground.Что бы это могло быть.Я вижу, как программа идет внутри метода execute, который, в свою очередь, вызывает метод execute AsyncTask.но это никогда не входит в метод doInBackground.Благодарю.

это вызывающий экземпляр внутри основного класса активности

portParser = new PortParser(this.getApplicationContext());
portParser.execute();

package org.pctechtips.netdroid.classes;

import android.os.AsyncTask;
import android.content.Context;
import android.util.*;
import org.pctechtips.netdroid.dbhelper.*;
import java.util.*;

import java.io.*;
import java.net.*;
import java.util.zip.*;

import javax.net.ssl.*;

/**
 * Java class to downloand and parse service-port csv file from iana.org
 */

public class PortParser {
    //public static final String PORT_URL = "https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.csv";
    public static final String PORT_URL = "http://pctechtips.org/apps/service-names-port-numbers.csv";
    org.pctechtips.netdroid.dbhelper.DatabaseHelper dbHelper;
    DownloadPortFile downloadFile;
    android.database.sqlite.SQLiteDatabase db;
    Context context;

    public PortParser(Context ctxt) {
        dbHelper = new org.pctechtips.netdroid.dbhelper.DatabaseHelper(ctxt);
        db = dbHelper.getWritableDatabase();
        downloadFile = new DownloadPortFile();
    }

    public void execute() {
        Log.v("DOWNLOADING", "DOWNLOADING PORT FILE");
        downloadFile.execute();
    }


    public class DownloadPortFile extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            BufferedReader in = null;
            HttpsURLConnection connection = null;

            try {
                URL url = new URL(PORT_URL);
                connection = (HttpsURLConnection) url.openConnection();
//                connection.setRequestProperty("Accept-Encoding", "gzip");
                connection.connect();
                Log.v("CONNECTION", "CONNECTION OK");
                if (connection.getResponseCode() == HttpsURLConnection.HTTP_OK) {
                   Log.v("CONNECTION", "CONNECTION OK");
                }
                in = new BufferedReader(new InputStreamReader(new GZIPInputStream(connection.getInputStream()), "UTF-8"));
                String line;
                int lineNum = 0;
                while ((line = in.readLine()) != null) {
                    String[] data = line.split(",", -1);
                    Log.v("DATA", Arrays.toString(data) +" "+ lineNum);
                    if(data.length != 12) { continue; }
                    if(data == null) { continue; }
                    if(!data[2].equalsIgnoreCase("tcp")) { continue; }

                    String service = (data[0].equals(" ")) ? "null" : data[0];
                    int portNum = Integer.parseInt(data[1]);
                    String protocol = data[2];
                    String desc = data[3];
                    Log.v("PARSED", service +" "+ portNum +" "+ protocol +" "+ desc +" "+data.length);

                    long dbInsert = dbHelper.addTableRecord(service, portNum, protocol, service);
                }

            } catch (Exception e) {

            } finally {
                /*try {
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException ignored) {
                }

                if (connection != null) {
                    connection.disconnect();
                }*/
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Void... voids) {

        }

        @Override
        protected void onPostExecute(Void aVoid) {

        }
    }

}

1 Ответ

1 голос
/ 11 апреля 2019

Я вижу, что после вызова execute, он переходит на следующую строку в MainActivity вместо перехода внутрь doInBackground

Так и должно быть, поскольку нет причин прерывать поток основного потока только потому, что вы породили другого асинхронного работника. Это было бы на самом деле противоречит тому, для чего предназначены асинхронные вещи. Если вы хотите отладить doInBackground(), вы должны установить где-нибудь точку останова для кода этого метода (+ вам может потребоваться вызвать Debug.waitOnDebugger () , если просто точка останова не будет работать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...