HttpURLConnection не будет работать после приостановки активности - PullRequest
0 голосов
/ 23 мая 2018

У меня есть Activity, которая использует ListView для отображения массива данных, извлеченных из ответа JSON.Нажатие на один из элементов представит пользователю активность визитной карточки, отображая данные, связанные с выбранным элементом.Когда приложение впервые загружается, оно работает нормально.Я могу закрыть визитную карточку и открыть ее несколько раз.Однако, если я приостановлю действие ListView, страница больше не будет загружать данные.Я поместил команды Log.d до и после подключения, чтобы попытаться отладить проблему.Деятельность получает информацию, необходимую для установления соединения.Однако самое близкое к решению, которое я получил, это знание того, что когда оно не работает, я не могу зарегистрировать код ответа сразу после открытия соединения.

Для ясности, я включаю в себя всекод, который я использую, на тот случай, если проблема заключается в другом.Сначала код активности ListView, затем код активности визитных карточек.

Это активность каталогов.

    public class DirectoryActivity extends AppCompatActivity {

    ListView lvContacts;
    Button goMenu;
    Button goFilter;
    TextView tempText;

    static ArrayList<String> arrlst = new ArrayList<>();
    static ArrayAdapter<String> adapter;

    private FetchList process;

    @Override

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_directory);

    lvContacts = findViewById(R.id.lvContacts);
    goMenu = findViewById(R.id.btn_goMenu);
    goFilter = findViewById(R.id.btn_goSearch);
    tempText = findViewById(R.id.temptext);

    // Set adapter for listview: used in FetchList
    adapter = new ArrayAdapter<>(this, R.layout.layout_org_list, R.id.listViewItem, arrlst );
    lvContacts.setAdapter(adapter);

    // Get list from DB
    process = new FetchList();
    process.setListener(new FetchList.FetchListTaskListener() {
        @Override
        public void onFetchListTaskFinished(String[] result) {
            // update UI in Activity here
            arrlst.clear();
            for (String OrgName:result) {
                addItemsToList(OrgName);
            }
            adapter.notifyDataSetChanged();
        }
    });
    process.execute();

    // Set onclick listener for listview
    lvContacts.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
            String selectedOrg = lvContacts.getItemAtPosition(position).toString(); // Get org name from list view
            goBusinessCard(selectedOrg); // Go to business card
        }
    });
}

@Override
protected void onDestroy() {
    process.setListener(null); // PREVENT LEAK AFTER ACTIVITY DESTROYED
    super.onDestroy();
}

public static void addItemsToList(String item) {
    arrlst.add(item);
}

// Set Methods for Buttons
public void goMenu(View v) {
    startActivity(new Intent(this, HomeActivity.class));
}

public void goFilter(View v) {
    startActivity(new Intent(this, FilterActivity.class));
    Log.d("FILTER DEBUG", "checking if extras are filled " + this.getIntent().getExtras());
}

// Method for opening BusinessCardActivity and passes orgID
public void goBusinessCard(String selectedOrg) {
    Bundle extras = new Bundle();
    extras.clear();
    extras.putString("selectedOrg", selectedOrg);
    Intent BusinessCard = new Intent(this, BusinessCardActivity.class);
    BusinessCard.putExtras(extras);
    startActivity(BusinessCard);
}

    // ASYNC TASK
static class FetchList extends AsyncTask<Void, Void, String[]> {
    private FetchListTaskListener listener;

    @Override
    protected String[] doInBackground(Void... voids) {

        try {

            URL url = new URL(URL_READ_ORG ); // Set url to API Call location
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); // Open connection to html
            InputStream inputStream = httpURLConnection.getInputStream(); // create input stream from html location
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8")); // create reader for inputStream

            StringBuilder data = new StringBuilder();
            String line;
            while ((line = bufferedReader.readLine()) != null ) {
                data.append(line); // creates string from all lines in response
            }

            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();

            JSONObject JO = new JSONObject(data.toString()); // creates object from json response in data string
            JSONArray JA = JO.getJSONArray("orgs");

            // Create array list to store items from json response
            List<String> al_orgList = new ArrayList<>();

            // Iterate through JSON array to get json object org_name
            for (int i = 0; i < JA.length(); i++) {
                JSONObject Orgs = JA.getJSONObject(i);
                String org_name = Orgs.getString("org_name");
                al_orgList.add(org_name);
            }

            // convert array list to array
            return al_orgList.toArray(new String[al_orgList.size()]);

        } catch (JSONException | IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    // UI Process - allows manipulation of UI
    @Override
    protected void onPostExecute(String[] result) {
        super.onPostExecute(result);
        if (listener != null) {
            listener.onFetchListTaskFinished(result);
        }
    }

    private void setListener(FetchListTaskListener listener) {
        this.listener = listener;
    }

    public interface FetchListTaskListener {
        void onFetchListTaskFinished(String[] result);
    }

}

Это активность визитных карточек, которая выполняет выборку данных дляотдельные предметы

    public class BusinessCardActivity extends AppCompatActivity {

    TextView tv_org, tv_name, tv_email, tv_phone, tv_website, tv_servicetype,
        tv_servicesprovided, tv_address;
    String Favorite, Latitude, Longitude, selectedOrg, FavoriteChanged, dbPhone, phoneNum, dbWeb, orgWeb;
    CheckBox cbFavorite;

    List<String> arrlstID = new ArrayList<>();
    String[] arrID;

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

    // Assign fields to variables
    tv_org = findViewById(R.id.tv_org);
    tv_name = findViewById(R.id.tv_name);
    tv_email = findViewById(R.id.tv_email);
    tv_phone = findViewById(R.id.tv_phone);
    tv_website = findViewById(R.id.tv_website);
    tv_servicetype = findViewById(R.id.tv_servicetype);
    tv_servicesprovided = findViewById(R.id.tv_servicesprovided);
    tv_address = findViewById(R.id.tv_address);
    cbFavorite = findViewById(R.id.cbFavorite);

    // Set variable for selectedOrg from DirectoryActivity
    selectedOrg = Objects.requireNonNull(this.getIntent().getExtras()).getString("selectedOrg");

    // Get Org data from DB using async
    process = new FetchOrg();
    process.setListener(new FetchOrg.FetchOrgTaskListener() {
        @Override
        public void onFetchOrgTaskFinished(String[] result) {
            setTextView(result);

            // onClick for Email
            tv_email.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v)
                {
                    showEmailDialog();
                }
            });

            // onClick for Call
            tv_phone.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Get phone number from DB
                    // Replace any non-digit in phone number to make call
                    phoneNum = dbPhone.replaceAll("\\D", "");

                    // make call
                    goCall(phoneNum);
                }
            });

            // onClick for Web
            tv_website.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Fix URL logic
                    orgWeb = "http://" + dbWeb;
                    goWeb(orgWeb);
                }
            });

            // onClick for Address
            tv_address.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    goMap();
                }
            });

            // TODO add favorite functionality
            // When checkbox status changes, change value of Favorite
            cbFavorite.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                }
            });
        }
    });
    process.execute(selectedOrg);


    /*
    // if favorite = 1 then check box
    if (Favorite.equals("1")) {
        cbFavorite.setChecked(true);
    } else {
        cbFavorite.setChecked(false);
    }
    */
}

@Override
protected void onDestroy() {
    process.setListener(null); // PREVENT LEAK AFTER ACTIVITY DESTROYED
    super.onDestroy();
}


// Method to assign text view items from async task
public void setTextView(String[] org_data) {

    String name = org_data[1] + " " + org_data[2];
    String address = org_data[8] + " " + org_data[9] + " " + org_data[10] + " " + org_data[11];

    tv_org.setText(org_data[0]);
    tv_name.setText(name);
    tv_email.setText(org_data[3]);
    tv_phone.setText(org_data[4]);
    tv_website.setText(org_data[5]);
    tv_servicetype.setText(org_data[6]);
    tv_servicesprovided.setText(org_data[7]);
    tv_address.setText(address);
}

public void showEmailDialog() {
    // Get dialog_box_goals.xml view
    LayoutInflater layoutInflater = LayoutInflater.from(BusinessCardActivity.this);
    View promptView = layoutInflater.inflate(R.layout.dialog_box_send_email, null);

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(BusinessCardActivity.this);
    alertDialogBuilder.setView(promptView);

    final EditText etEmailMessage = (EditText) promptView.findViewById(R.id.etMailMessage);

    // setup a dialog window
    alertDialogBuilder.setCancelable(false)

            .setPositiveButton("Submit", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // my code

                /* WONT USE THIS UNTIL EMAILS ARE FINAL
                   USING MY EMAIL FOR TESTING PURPOSES
                    // Get email
                    niagaraDB.open();
                    c2 = niagaraDB.getEmailByID(passedID);
                    if (c2.moveToFirst())
                    {
                        public String emailTo = c2.getString(0);
                    }
                    niagaraDB.close();
                */

                    // This is for final code
                    // String to = "mailto:" + emailTo;
                    String to = "snownwakendirt@yahoo.com";
                    String subject = "Mail From Connect & Protect Niagara App";
                    String message = etEmailMessage.getText().toString();

                    if (message.isEmpty()) {
                        Toast.makeText(BusinessCardActivity.this,
                                "Message must contain something",
                                Toast.LENGTH_LONG).show();
                    } else {
                        Intent email = new Intent(Intent.ACTION_SEND);
                        email.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
                        // email.putExtra(Intent.EXTRA_CC, new String[]{ to});
                        // email.putExtra(Intent.EXTRA_BCC, new String[]{to});
                        email.putExtra(Intent.EXTRA_SUBJECT, subject);
                        email.putExtra(Intent.EXTRA_TEXT, message);

                        // need this to prompt email client only
                        email.setType("message/rfc822");

                        try {
                            startActivity(Intent.createChooser(email, "Choose an Email client :"));
                            finish();
                            Log.i("Email Sent...", "");
                        } catch (android.content.ActivityNotFoundException ex) {
                            Toast.makeText(BusinessCardActivity.this,
                                    "There is no email client installed.",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }

                }
            })

            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });

    // create an alert dialog
    AlertDialog alert = alertDialogBuilder.create();
    alert.show();
}

public void goCall(final String phoneNum) {
    startActivity(new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phoneNum, null)));
}

public void goWeb(String orgWeb) {
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(orgWeb)));
}

public void goCloseBusinessCard(View v) {
    finish();
    startActivity(new Intent(this, DirectoryActivity.class));
}

public void goMap() {
    /*
      int locationAddressLatInt = Integer.parseInt(locationAddressLat);
      int locationAddressLongInt = Integer.parseInt(locationAddressLong);
     */

    // pass id to map view. only one item in array for ease of use in MapActivity
    arrlstID.add(selectedOrg);
    arrID = new String[arrlstID.size()];
    arrlstID.toArray(arrID);

    Bundle extras = new Bundle();
    extras.putStringArray("arrID", arrID);
    Intent Map = new Intent(BusinessCardActivity.this, MapActivity.class);
    Map.putExtras(extras);
    startActivity(Map);
}


// ASYNC TASK
static class FetchOrg extends AsyncTask<String, Void, String[]> {
    private FetchOrgTaskListener listener;

    @Override
    protected String[] doInBackground(String... params) {
        try {

            // assign passed string from main thread
            String org_name = params[0];
            String orgbyname = URL_GET_ORG_BY_NAME + "?org_name=" + org_name;
            String line = "";

            URL url = new URL(orgbyname);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                InputStream is = conn.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));

                line = br.readLine();

                br.close();
                is.close();
                conn.disconnect();


        /*
            This JSON section contains a JSON Object that holds a JSON Array. The Array is created to
            individualize each object within the JSON Array. Then, each JSON object is fetched and
            assigned to a string variable.
         */
            JSONObject JO = new JSONObject(line); // creates object from json response in data string
            JSONObject Orgs = JO.getJSONObject("orgs"); // creates array for parsing of json data

            // get items from JSONArray and assign for passing to onProgressUpdate
            String Org = Orgs.getString("org_name");
            String FirstName = Orgs.getString("contact_first_name");
            String LastName = Orgs.getString("contact_last_name");
            String Email = Orgs.getString("contact_email");
            String Phone = Orgs.getString("contact_phone");
            String Website = Orgs.getString("org_website");
            String ServiceType = Orgs.getString("org_type");
            String ServicesProvided = Orgs.getString("org_services");
            String Address = Orgs.getString("org_street_address");
            String City = Orgs.getString("org_city");
            String State = Orgs.getString("org_state");
            String Zip = Orgs.getString("org_zip");
            String Lat = Orgs.getString("latitude");
            String Long = Orgs.getString("longitude");

            // Add items to string array
            String[] org_data = new String[14]; // 14 is length of array, not the count
            org_data[0] = Org;
            org_data[1] = FirstName;
            org_data[2] = LastName;
            org_data[3] = Email;
            org_data[4] = Phone;
            org_data[5] = Website;
            org_data[6] = ServiceType;
            org_data[7] = ServicesProvided;
            org_data[8] = Address;
            org_data[9] = City;
            org_data[10] = State;
            org_data[11] = Zip;
            org_data[12] = Lat;
            org_data[13] = Long;

            return org_data;

        } catch (IOException | JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String[] result) {
        super.onPostExecute(result);
        if (listener != null) {
            listener.onFetchOrgTaskFinished(result);
        }
    }

    private void setListener(FetchOrgTaskListener listener) {
        this.listener = listener;
    }

    public interface FetchOrgTaskListener {
        void onFetchOrgTaskFinished(String[] result);
    }
}

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Я внес несколько изменений в ваш onCreate() метод вашего BusinessCardActivity.Вместо этого я проверяю hasExtra - немного больше гибкости.Я избавился от Listener и собрал всех onClick слушателей ниже.Я чувствовал, что это было слишком сложно с использованием подхода Listener (поэтому вы можете удалить этот process.setListener(null); из метода onDestroy()).Я также добавил несколько Log.e();, чтобы вы могли видеть, что происходит в logcat.

(BTW "TAG" будет:

private static final Strting TAG = BusinessCardActivity.class.getSimpleName();)

С "BusinessCardActivity.class.getSimpleName ();"выписан на всякий случай, если вы когда-нибудь проведете рефакторинг.

Это часть вашего BusinessCardActivity onCreate() метода:

// Set variable for selectedOrg from DirectoryActivity
Intent intent = this.getIntent();
if(intent.hasExtra(selectedOrg)){
    String selectedOrg = intent.getStringExtra("selectedOrg")
    Log.e(TAG, "selectedOrg : " + selectedOrg);
    FetchOrg process = new FetchOrg();
    process.execute(selectedOrg);
}
else{
    Log.e(TAG, "No Extras!")
    //You might what to call finish() here
    return;
}

//Move all your onClick Listeners below...

Не думаю, что это лучший вариант для использованияListener так что давайте использовать AsyncTask вот так (я также удалил static):

class FetchOrg extends AsyncTask<String, Void, String[]> {

    @Override
    protected String[] doInBackground(String... params) {
        try {

            Log.e(TAG, "doInBackground ... Started");
            // assign passed string from main thread
            String org_name = params[0];
            String orgbyname = URL_GET_ORG_BY_NAME + "?org_name=" + org_name;
            String line = "";

            URL url = new URL(orgbyname);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                InputStream is = conn.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8"));

                line = br.readLine();

                br.close();
                is.close();
                conn.disconnect();

            Log.e(TAG, "Data Returned : " + line);

        /*
            This JSON section contains a JSON Object that holds a JSON Array. The Array is created to
            individualize each object within the JSON Array. Then, each JSON object is fetched and
            assigned to a string variable.
         */
            JSONObject JO = new JSONObject(line); // creates object from json response in data string
            JSONObject Orgs = JO.getJSONObject("orgs"); // creates array for parsing of json data

            // get items from JSONArray and assign for passing to onProgressUpdate
            String Org = Orgs.getString("org_name");
            String FirstName = Orgs.getString("contact_first_name");
            String LastName = Orgs.getString("contact_last_name");
            String Email = Orgs.getString("contact_email");
            String Phone = Orgs.getString("contact_phone");
            String Website = Orgs.getString("org_website");
            String ServiceType = Orgs.getString("org_type");
            String ServicesProvided = Orgs.getString("org_services");
            String Address = Orgs.getString("org_street_address");
            String City = Orgs.getString("org_city");
            String State = Orgs.getString("org_state");
            String Zip = Orgs.getString("org_zip");
            String Lat = Orgs.getString("latitude");
            String Long = Orgs.getString("longitude");

            // Add items to string array
            String[] org_data = new String[14]; // 14 is length of array, not the count
            org_data[0] = Org;
            org_data[1] = FirstName;
            org_data[2] = LastName;
            org_data[3] = Email;
            org_data[4] = Phone;
            org_data[5] = Website;
            org_data[6] = ServiceType;
            org_data[7] = ServicesProvided;
            org_data[8] = Address;
            org_data[9] = City;
            org_data[10] = State;
            org_data[11] = Zip;
            org_data[12] = Lat;
            org_data[13] = Long;

            return org_data;

        } catch (IOException | JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String[] result) {
        setTextView(result);
    }
}

Также я бы немного изменил ваш метод goBusinessCard() (и не нужно быть публичным):

private void goBusinessCard(String selectedOrg) {
    //Java variables should written in lower case and Classes Capitalized
    Intent businessCard = new Intent(this, BusinessCardActivity.class);
    businessCard.putExtra("selectedOrg", selectedOrg);
    startActivity(businessCard);
}

Пожалуйста, дайте мне знать, если у вас есть какие-либо проблемы!Я набрал это в стандартном текстовом редакторе ... так что может быть несколько опечаток.

0 голосов
/ 23 мая 2018

Отправка нового ответа, чтобы я мог добавить весь код для класса BusinessCardActivity.

Я добавил дополнительное ведение журнала и изменил getString() на optString(), чтобы иметь возможность предложить альтернативное значение.Например, если значение или «ключ» неверны или отсутствуют, вы получите сообщение об ошибке.

открытый класс BusinessCardActivity расширяет AppCompatActivity {

    TextView tv_org, tv_name, tv_email, tv_phone, tv_website, tv_servicetype,
        tv_servicesprovided, tv_address;
    String Favorite, Latitude, Longitude, FavoriteChanged, dbPhone, phoneNum, dbWeb, orgWeb;
    CheckBox cbFavorite;

    List<String> arrlstID = new ArrayList<>();
    String[] arrID;

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

    // Assign fields to variables
    tv_org = findViewById(R.id.tv_org);
    tv_name = findViewById(R.id.tv_name);
    tv_email = findViewById(R.id.tv_email);
    tv_phone = findViewById(R.id.tv_phone);
    tv_website = findViewById(R.id.tv_website);
    tv_servicetype = findViewById(R.id.tv_servicetype);
    tv_servicesprovided = findViewById(R.id.tv_servicesprovided);
    tv_address = findViewById(R.id.tv_address);
    cbFavorite = findViewById(R.id.cbFavorite);


    Intent intent = this.getIntent();
    if(!intent.hasExtra("selectedOrg")){
        Log.e(TAG, "No Extras!")
        //You might what to call finish() here
        return;
    }

        String selectedOrg = intent.getStringExtra("selectedOrg")
        Log.e(TAG, "selectedOrg : " + selectedOrg);
        FetchOrg process = new FetchOrg();
        process.execute(selectedOrg);

        // onClick for Email
        tv_email.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v)
                {
                    showEmailDialog();
                }
            });

            // onClick for Call
            tv_phone.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Get phone number from DB
                    // Replace any non-digit in phone number to make call
                    phoneNum = dbPhone.replaceAll("\\D", "");

                    // make call
                    goCall(phoneNum);
                }
            });

            // onClick for Web
            tv_website.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Fix URL logic
                    orgWeb = "http://" + dbWeb;
                    goWeb(orgWeb);
                }
            });

            // onClick for Address
            tv_address.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    goMap();
                }
            });

            // TODO add favorite functionality
            // When checkbox status changes, change value of Favorite
            cbFavorite.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                }
            });


    /*
    // if favorite = 1 then check box
    if (Favorite.equals("1")) {
        cbFavorite.setChecked(true);
    } else {
        cbFavorite.setChecked(false);
    }
    */
}

@Override
protected void onDestroy() {
    process.setListener(null); // PREVENT LEAK AFTER ACTIVITY DESTROYED
    super.onDestroy();
}


// Method to assign text view items from async task
public void setTextView(String[] org_data) {

    String name = org_data[1] + " " + org_data[2];
    String address = org_data[8] + " " + org_data[9] + " " + org_data[10] + " " + org_data[11];

    tv_org.setText(org_data[0]);
    tv_name.setText(name);
    tv_email.setText(org_data[3]);
    tv_phone.setText(org_data[4]);
    tv_website.setText(org_data[5]);
    tv_servicetype.setText(org_data[6]);
    tv_servicesprovided.setText(org_data[7]);
    tv_address.setText(address);
}

public void showEmailDialog() {
    // Get dialog_box_goals.xml view
    LayoutInflater layoutInflater = LayoutInflater.from(BusinessCardActivity.this);
    View promptView = layoutInflater.inflate(R.layout.dialog_box_send_email, null);

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(BusinessCardActivity.this);
    alertDialogBuilder.setView(promptView);

    final EditText etEmailMessage = (EditText) promptView.findViewById(R.id.etMailMessage);

    // setup a dialog window
    alertDialogBuilder.setCancelable(false)

            .setPositiveButton("Submit", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // my code

                /* WONT USE THIS UNTIL EMAILS ARE FINAL
                   USING MY EMAIL FOR TESTING PURPOSES
                    // Get email
                    niagaraDB.open();
                    c2 = niagaraDB.getEmailByID(passedID);
                    if (c2.moveToFirst())
                    {
                        public String emailTo = c2.getString(0);
                    }
                    niagaraDB.close();
                */

                    // This is for final code
                    // String to = "mailto:" + emailTo;
                    String to = "snownwakendirt@yahoo.com";
                    String subject = "Mail From Connect & Protect Niagara App";
                    String message = etEmailMessage.getText().toString();

                    if (message.isEmpty()) {
                        Toast.makeText(BusinessCardActivity.this,
                                "Message must contain something",
                                Toast.LENGTH_LONG).show();
                    } else {
                        Intent email = new Intent(Intent.ACTION_SEND);
                        email.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
                        // email.putExtra(Intent.EXTRA_CC, new String[]{ to});
                        // email.putExtra(Intent.EXTRA_BCC, new String[]{to});
                        email.putExtra(Intent.EXTRA_SUBJECT, subject);
                        email.putExtra(Intent.EXTRA_TEXT, message);

                        // need this to prompt email client only
                        email.setType("message/rfc822");

                        try {
                            startActivity(Intent.createChooser(email, "Choose an Email client :"));
                            finish();
                            Log.i("Email Sent...", "");
                        } catch (android.content.ActivityNotFoundException ex) {
                            Toast.makeText(BusinessCardActivity.this,
                                    "There is no email client installed.",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }

                }
            })

            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });

    // create an alert dialog
    AlertDialog alert = alertDialogBuilder.create();
    alert.show();
}

public void goCall(final String phoneNum) {
    startActivity(new Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phoneNum, null)));
}

public void goWeb(String orgWeb) {
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(orgWeb)));
}

public void goCloseBusinessCard(View v) {
    finish();
    startActivity(new Intent(this, DirectoryActivity.class));
}

public void goMap() {
    /*
      int locationAddressLatInt = Integer.parseInt(locationAddressLat);
      int locationAddressLongInt = Integer.parseInt(locationAddressLong);
     */

    // pass id to map view. only one item in array for ease of use in MapActivity
    arrlstID.add(selectedOrg);
    arrID = new String[arrlstID.size()];
    arrlstID.toArray(arrID);

    Bundle extras = new Bundle();
    extras.putStringArray("arrID", arrID);
    Intent Map = new Intent(BusinessCardActivity.this, MapActivity.class);
    Map.putExtras(extras);
    startActivity(Map);
}


// ASYNC TASK
class FetchOrg extends AsyncTask<String, Void, String[]> {

    @Override
    protected String[] doInBackground(String... params) {
        HttpURLConnection con = null;
        String[] org_data = null;
        try {
            Log.e(TAG, "FetchOrg doInBackground started");

            // assign passed string from main thread
            String org_name = params[0];
            String orgbyname = URL_GET_ORG_BY_NAME + "?org_name=" + org_name;

            URL url = new URL(orgbyname);
            con = (HttpURLConnection) url.openConnection();
            Log.e(TAG, "FetchOrg doInBackground Connected!");


            //Check the response code of the server -
            Integer replyCode = con.getResponseCode();
            logMess += "   Reply Code:  " + replyCode.toString();

            responseStream = new BufferedInputStream(con.getInputStream());
            BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream));

            stopTime = System.currentTimeMillis();
            elapsedTime = stopTime - startTime;
            logMess += "   elapsed Time :  " + elapsedTime + " ms";

            Log.e(TAG, "FetchOrg logMess:  --- " + logMess);
            String line = "";
            StringBuilder stringBuilder = new StringBuilder();

            //Make sure you get everything!
            while ((line = responseStreamReader.readLine()) != null) {
                stringBuilder.append(line).append("\n");
            }

            //this will close underlying streams
            responseStreamReader.close();

            String data = stringBuilder.toString();
            Log.e(TAG, "FetchOrg Data:  --- " + data);

        /*
            This JSON section contains a JSON Object that holds a JSON Array. The Array is created to
            individualize each object within the JSON Array. Then, each JSON object is fetched and
            assigned to a string variable.
         */
            JSONObject obj = new JSONObject(data); // creates object from json response in data string
            JSONObject orgs = obj.getJSONObject("orgs"); // creates array for parsing of json data

            String nA = "not available";

            // get items from JSONArray and assign for passing to onProgressUpdate
            String Org = orgs.optString("org_name", nA);
            String FirstName = orgs.optString("contact_first_name", nA);
            String LastName = orgs.optString("contact_last_name", nA);
            String Email = orgs.optString("contact_email", nA);
            String Phone = orgs.optString("contact_phone", nA);
            String Website = orgs.optString("org_website", nA);
            String ServiceType = orgs.optString("org_type", nA);
            String ServicesProvided = orgs.optString("org_services", nA);
            String Address = orgs.optString("org_street_address", nA);
            String City = orgs.optString("org_city", nA);
            String State = orgs.optString("org_state", nA);
            String Zip = orgs.optString("org_zip", nA);
            String Lat = orgs.optString("latitude", nA);
            String Long = orgs.optString("longitude", nA);

            // Add items to string array
            org_data = new String[14]; // 14 is length of array, not the count
            org_data[0] = Org;
            org_data[1] = FirstName;
            org_data[2] = LastName;
            org_data[3] = Email;
            org_data[4] = Phone;
            org_data[5] = Website;
            org_data[6] = ServiceType;
            org_data[7] = ServicesProvided;
            org_data[8] = Address;
            org_data[9] = City;
            org_data[10] = State;
            org_data[11] = Zip;
            org_data[12] = Lat;
            org_data[13] = Long;

        } catch (Exception ex) {
            Log.e(TAG, "FetchOrg doInBackground: " + ex.getMessage());
        }
        finally{
            //just in case you get an error above
            if(con != null){
                con.disconnect();
            }
        }

        return org_data;
    }

    @Override
    protected void onPostExecute(String[] result) {
        if(result != null){
            setTextView(result);
        }
        else{
            Log.e(TAG, "FetchOrg onPostExecute: result is null");
        }
    }
}

Помните, что я не очищал такие вещи, какподдержание минимальной области видимости: например: public void showEmailDialog() и public void goMap(), которые не должны быть публичными методами!Любой метод, к которому нет необходимости обращаться за пределы класса (и это редко!), Не должен выполняться public.

Вы также определили много переменных класса в начале класса, таких как "Favorite, Latitude, Longitude, FavoriteChanged", они должны иметь широкую область видимости ??И они переменные!Таким образом, в соглашении об именах java переменные и методы пишутся в нижнем регистре, а классы пишутся с заглавной буквы - это помогает легче читать код (для сообщества SO!)

При работе с Indent дополнительные функции часто допускают ошибкипри вводе «ключа», как «selectedOrg».Поэтому иногда бывает полезно создать глобальный класс, который поможет сохранить порядок.Пример public class GlobalExtras и просто оставить public static final String SELECTED_ORG = "selectedOrg"; Затем просто используйте intent.getString(SELECTED_ORG);

Еще одна вещь: я не большой поклонник String[], поскольку вы использовали для хранения своих строк "org".Они могут быть хитрыми с размером и индексами.Возможно, вы захотите рассмотреть возможность использования другого объекта.

У меня нет доступа к вашему API и вашим данным, поэтому я мог только делать запросы на моем сервере, пытаясь дублировать ваш пользовательский сценарий, но я не смогвоспроизведите вашу проблему.Надеюсь, это поможет, дайте мне знать, что выплевывает logcat!

0 голосов
/ 23 мая 2018

Жизненный цикл активности вернется из состояния паузы в состояние возобновления.Вы должны предоставить ожидаемое поведение внутри onResume, как показано ниже

public void onResume(){ 
    super.onResume(); 
      new XXXAsyncTask( new XXXAsyncListener(){ 
      public void postTaskMethod(){ 
     //do stuff here 
     } 
    }).execute(); 
    }
...