0
  1. In my activity i have an AsyncTask, in which i had overridden doInBackGround.

  2. In the same activity i have a camera intent to open the camera and allow user to take a pic

The problem is when i call the camera intent it is triggering the doInBackGround method i overrode. Which eventually gives me a SingleClientConnManager exception which asks me to release the client before allocating it again.

Here is my activity code:

public class UserProfileActivity extends Activity {

//many instance fiels here
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.user_profile);

        new LongOperation().execute("");

        userImage = (ImageView) findViewById(R.id.profileImage);
        userName = (TextView) findViewById(R.id.userName_profile);
        userLocation = (TextView) findViewById(R.id.userLocation_profile);
        editInfo = (TextView) findViewById(R.id.edit_profile);
        changeImage = (TextView) findViewById(R.id.changeImage_profile);
        userScore = (TextView) findViewById(R.id.userScore_profile);
        friendsLabel = (TextView) findViewById(R.id.userFriends_profile);


            changeImage.setOnClickListener(new View.OnClickListener() {

                public void onClick(View arg0) {
                    Intent cameraIntent = new Intent(
                            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(cameraIntent, CAMERA_REQUEST);
//Point 1
                }
            });
//Point 2
    }
    private class LongOperation extends AsyncTask<String, Void, String> {

        private InputStream is;
        private StringBuilder sb;
        private String result;
        private ProgressDialog dialog = new ProgressDialog(context);

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

//Point 3
            try {
                HttpResponse response;

                    HttpPost httppost = new HttpPost(
                            "http://www.xxxxx.com/yyyy/zzzz");
                    //httpclient is global to maintain sessions
                    response = SignUpActivity.httpclient.execute(httppost);
                    HttpEntity entity = response.getEntity();
                    is = entity.getContent();

                try {
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(is, "iso-8859-1"), 8);
                    sb = new StringBuilder();
                    sb.append(reader.readLine() + "\n");
                    String line = "0";
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    is.close();
                    result = sb.toString();
                } catch (Exception e) {
                    Log.e("error in reading input stream", e.toString());
                }
                try {
                    JSONObject jObj = new JSONObject(result);
                    String status = jObj.getString("status");
                    score = jObj.getInt("credits");
                    level = jObj.getInt("level");
                    image = jObj.getString("image");
                    fname = jObj.getString("fname");
                    lname = jObj.getString("lname");
                    city = jObj.getString("city");
                    email = jObj.getString("email");
                    clickedUserId = jObj.getInt("user_id");

                    JSONArray friendsJsonArray = jObj.getJSONArray("friends");
                    size = friendsJsonArray.length();

                    ArrayList<String> friendsNames = new ArrayList<String>();
                    friendsIds = new int[size];
                    for (int i = 0; i < size; i++) {

                        friendsNames.add(friendsJsonArray.getJSONObject(i)
                                .getString("name"));
                        friendsIds[i] = friendsJsonArray.getJSONObject(i)
                                .getInt("user_id");
                    }
                    adapter = new ArrayAdapter<String>(context,
                            R.layout.simple_listview_item, friendsNames);
                } catch (Exception e) {

                    Log.d("error in creating json object", e.toString());
                }
            } catch (Exception e) {
//Point 5
                Log.e("error main try", "Error in http connection" + e.toString());
            }
            return "Executed";
        }
        @Override
        protected void onPostExecute(String result) {

            friendsList.setAdapter(adapter);
            userScore.setText(score + " points" + "   level " + level);
            userName.setText(fname + "  " + lname);
            userLocation.setText(city);
            changeImage.setText("Change image");
            editInfo.setText("Edit");
            friendsLabel.setText("Friends");
            Bitmap bitmap = null;
            try {
                bitmap = BitmapFactory
                        .decodeStream((InputStream) new URL(image).getContent());
                userImage.setImageBitmap(bitmap);
            } catch (MalformedURLException e1) {

                e1.printStackTrace();
                userImage.setImageResource(R.drawable.xxx);
            } catch (IOException e2) {

                e2.printStackTrace();
                userImage.setImageResource(R.drawable.xxx);
            }

            if (dialog.isShowing()) {
                dialog.dismiss();
            }
        }

        @Override
        protected void onPreExecute() {

            this.dialog.setMessage("Please wait");
            this.dialog.show();
        }

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

        }
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

//Point 4
        if (resultCode == RESULT_OK) {
            if (data != null) {

                photo = (Bitmap) data.getExtras().get("data");
                userImage.setImageBitmap(photo);

            }else{

                Intent intent = new Intent(UserProfileActivity.this,
                        UserProfileActivity.class);
                startActivity(intent);
            }
        } else {

            Intent intent = new Intent(UserProfileActivity.this,
                    UserProfileActivity.class);
            startActivity(intent);
        }
    }
}

here in the code Point 1, 2, 3, 4, 5 gives the sequence of code flow once i click the changeImage TextView.

Please help me in solving this scenario.

Thank You.

Archie.bpgc
  • 23,812
  • 38
  • 150
  • 226

1 Answers1

0

If I am correct the problem is because of your device orientation get changed when you open camera.That calls your activity's onCreate() method again please insert this line to your activity in menifest that is causing problem

 <activity
            android:name="your activity" android:configChanges="keyboardHidden|orientation"
          />
Atul Bhardwaj
  • 6,647
  • 5
  • 45
  • 63
  • no. I am sure its not because of the orientation change. I am not changing the orientation while using my app. Moreover i have already written this code in all the activities. after searching for a whole day for a solution, i found out that this is because camera intent calls the doInBackground method. So far i never used both async task and camera intent call in the same activity. If you want you can go through this question of mine similar to this. http://stackoverflow.com/questions/11865001/will-onactivityresult-restart-my-activity – Archie.bpgc Aug 14 '12 at 12:13