2012-08-08 114 views
0

在我的活動中,我使用AsyncTask設置所有視圖,如ImageView,TextViews及其各自的數據。將onActivityResult()重新啓動我的活動?

asyncTask.Execute();

我有一個textView.onCLickListener這就要求相機和拍攝照片後,在活動中的ImageView設置爲這個照片。

但問題是我的asyncTask在onActivityResult()之後被再次調用;

這裏是我完整的活動代碼:

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); 
     } 
    } 
} 
+1

,如果你的意思是,如果將的onCreate調用,那麼沒有:) – 2012-08-08 13:00:26

+0

到這裏看看:http://developer.android。 com/reference/android/app/Activity.html – 2012-08-08 13:01:00

+0

但我的logcat顯示LongOperation.execute(「」);再次被調用。這會導致「SingleClientConnManager異常:SingleClientConnManager的無效使用:連接仍然分配。」 – 2012-08-08 13:02:22

回答

0

相機活動是爲了在後臺運行。

使用意圖

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(cameraIntent, CAMERA_REQUEST); 

將調用doInBackground(字符串... PARAMS)

2

看起來像你通過創建一個新的意圖,並開始在startActivityForResult邏輯的活動(代碼的底部)

+0

中的每個活動的方向更改,但我的代碼從未到達任何其他塊。我測試使用日誌 – 2012-08-08 13:07:30

+0

我相信它確實。用斷點調試你的代碼,看看它爲什麼發生 – IncrediApp 2012-08-08 13:10:55

+0

如果我是你,我會再次測試它。嘗試調試,而不是日誌,很容易看到發生了什麼 – 2012-08-08 13:13:27

0
再重新創建活動

您在收到圖片後再次開始活動。這就是爲什麼onCreate被調用並且AsyncTask再次執行。

+0

但我在哪裏再次打電話給活動?? \ – 2012-08-08 13:06:33

1

它的內存泄漏的問題。因此呼叫相機。嘗試使用

BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
bmOptions.inSampleSize = 8; 

由於從相機拍攝的圖像會產生巨大的大小位圖