暂停活动

时间:2018-05-22 23:04:17

标签: java android android-studio httpurlconnection

我有一个Activity,它使用ListView显示从JSON响应中获取的数据数组。单击其中一个项目将向用户显示名片活动,显示与单击项目关联的数据。当应用程序首次加载时,它工作正常。我可以关闭名片并重新打开它多次。但是,如果我暂停ListView活动,页面将不再加载数据。我在连接之前和之后放置了Log.d命令以尝试调试问题。活动正在接收执行连接所需的信息。但是,我最接近解决方案的是知道当它不起作用时,我无法在打开连接后立即记录响应代码。

要清楚,我要包含我正在使用的全部代码,以防问题出在其他地方。首先是ListView Activity的代码,然后是名片活动代码。

这是目录活动。

    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 :(得分:0)

活动生命周期将从暂停状态恢复到恢复状态。 你需要在onResume里面提供预期的行为,如下所示

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

答案 1 :(得分:0)

我对onCreate()的{​​{1}}方法进行了一些更改。我检查了BusinessCardActivity - 更灵活一点。我摆脱了hasExtra并打包了下面的所有Listener听众。我觉得使用onClick方法有点过于复杂(所以你可以从Listener方法中删除这个process.setListener(null);)。我还添加了一些onDestroy(),以便您可以看到logcat中发生了什么。

(BTW“标签”将是:

Log.e();

使用“BusinessCardActivity.class.getSimpleName();”写出来以防万一你重构。

这是private static final Strting TAG = 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()

如果您有任何问题,请与我们联系!我在标准的文本编辑器中输入了这个...所以可能会有一些错别字。

答案 2 :(得分:0)

发布新答案,以便我可以添加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吐出来的东西!