【问题标题】:Android - IllegalStateException: Content has been consumedAndroid - IllegalStateException:内容已被使用
【发布时间】:2015-10-21 06:31:37
【问题描述】:

我搜索了它,但我不知道在我的代码中多次使用哪个实体。您能告诉我必须针对这些错误修复哪个部分吗?我尝试将我将从我的 php 端获得的 JSONObject 的值传递给我的下一个活动。

public class UploadToServerActivity extends Activity {

ArrayList<Integer> xPoint, yPoint;
byte[] img;
String imagePath;
String imageData;
Button b1, b2;
ImageView v1;
Bitmap imageDrawOverlay;

int answerId, accuracyNum;
String jsonResult = "";
String srcString = "";

String urlServer = "~~.php";
//HttpURLConnection connection = null;

HttpURLConnection con = null;
String responseFromServer;
private static final String  TAG = UploadToServerActivity.class.getSimpleName();

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

    b1 = (Button)findViewById(R.id.button);
    b2 = (Button)findViewById(R.id.button2);
    v1 = (ImageView)findViewById(R.id.imageView3);

    Intent intent = getIntent();

    xPoint = intent.getIntegerArrayListExtra("xData");
    yPoint = intent.getIntegerArrayListExtra("yData");
    imagePath = intent.getStringExtra("imagePath");

    Bitmap bp = null;
    if(getIntent().hasExtra("imagePath")) {

        File file = new File(getIntent().getStringExtra("imagePath"));

        try {
            bp = MediaStore.Images.Media.getBitmap(getContentResolver(), Uri.fromFile(file));

        } catch (IOException e) {
            e.printStackTrace();
            Log.d(TAG, "Error: " + e.toString());
        }
    }
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bp.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    img = stream.toByteArray();


    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Log.d(TAG, "hello");
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    uploadToServer();
                }
            });
            t.start();

            Toast.makeText(UploadToServerActivity.this,"Upload Successful", Toast.LENGTH_SHORT).show();
        }
    });

    b2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(UploadToServerActivity.this, MenuActivity.class);
            startActivity(intent);
        }
    });

    if (getIntent().hasExtra("imagePath")) {
        File file = new File(getIntent().getStringExtra("imagePath"));

        try {
            bp = MediaStore.Images.Media.getBitmap(getContentResolver(), Uri.fromFile(file));

        } catch (IOException e) {
            e.printStackTrace();
            Log.d(TAG, "Error: " + e.toString());
        }

        Log.d(TAG, "Width: " + bp.getWidth() + " Height: " + bp.getHeight());

        v1.setImageBitmap(bp);
        imageDrawOverlay = bp;
    }
}

@SuppressWarnings("deprecation")
public boolean uploadToServer() {
    try {
        String responseString = null;
        HttpClient httpclient = new DefaultHttpClient();

        HttpPost httpPost = new HttpPost(urlServer);
        HttpPost httpPostTwo = new HttpPost(urlServerTwo);

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        imageData = Base64.encodeToString(img, Base64.DEFAULT);
        String xDat = xPoint.toString();
        String yDat = yPoint.toString();

        nameValuePairs.add(new BasicNameValuePair("imageData", imageData));
        nameValuePairs.add(new BasicNameValuePair("xData", xDat));
        nameValuePairs.add(new BasicNameValuePair("yData", yDat));
        Log.d(TAG, "xp: " + xPoint.toString());
        Log.d(TAG, "yp: " + yPoint.toString());
        Log.d(TAG, "im: " + imageData.length());

        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httpPost);

        String responseBody = EntityUtils.toString(response.getEntity());
        Log.d(TAG, responseBody);
        responseFromServer = responseBody;

        HttpEntity result = response.getEntity();
        if (result != null) {
            InputStream input = result.getContent();
            jsonResult = convertStreamToString(input);
            Log.d(TAG, jsonResult);
            Log.d(TAG, "jesonResult works");

            testReceiveData(jsonResult);
            Log.d(TAG, "maybe this one works too");
        } else {
            Log.d(TAG, "broke in repsonse");
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return true;
}

private String convertStreamToString(InputStream is) {
    String line = "";
    StringBuilder total = new StringBuilder();
    BufferedReader rd = new BufferedReader(new InputStreamReader(is));
    try {
        while ((line = rd.readLine()) != null) {
            total.append(line);
        }
    } catch (Exception e) {
        Toast.makeText(this, "Stream Exception", Toast.LENGTH_SHORT).show();
    }
    return total.toString();
}

public void triggerImageUpload() {
    makeHTTPCall();
}

public void makeHTTPCall() {
}

public void testReceiveData(String jsonResult) {
    try {
        srcString = jsonResult;
        Log.d(TAG, "here"+srcString);

        JSONObject jsonObj = new JSONObject(jsonResult);
        answerId = jsonObj.getInt("animal_id");
        accuracyNum = jsonObj.getInt("accuracy");

        Log.d(TAG, "It gets JSONObject");
        Intent intent = new Intent(UploadToServerActivity.this, ResultActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("ansId", String.valueOf(answerId));
        bundle.putString("accNum", String.valueOf(accuracyNum));

        intent.putExtras(bundle);
        startActivity(intent);

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

logcat 消息如下:

07-29 23:02:34.442    4885-5988/com.example.kange1.bert D/UploadToServerActivity﹕ [ 07-29 23:02:34.442  4885: 5988 W/System.err ]
java.lang.IllegalStateException: Content has been consumed
07-29 23:02:34.443    4885-5988/com.example.kange1.bert W/System.err﹕ at org.apache.http.entity.BasicHttpEntity.getContent(BasicHttpEntity.java:89)
07-29 23:02:34.443    4885-5988/com.example.kange1.bert W/System.err﹕ at org.apache.http.conn.BasicManagedEntity.getContent(BasicManagedEntity.java:105)
07-29 23:02:34.451    4885-5988/com.example.kange1.bert W/System.err﹕ at com.example.kange1.bert.UploadToServerActivity.testSecondEntity(UploadToServerActivity.java:284)
07-29 23:02:34.451    4885-5988/com.example.kange1.bert W/System.err﹕ at com.example.kange1.bert.UploadToServerActivity.uploadToServer(UploadToServerActivity.java:211)
07-29 23:02:34.451    4885-5988/com.example.kange1.bert W/System.err﹕ at com.example.kange1.bert.UploadToServerActivity$1$1.run(UploadToServerActivity.java:122)
07-29 23:02:34.455    4885-5988/com.example.kange1.bert W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

很抱歉,我问了你很多事情,但是你能告诉我线程是否可以访问或在下一个活动中运行吗? (当我单击按钮转到下一个活动时,我收到这些错误。它不会继续下一个活动,只是停留在当前活动中。


在我添加了 HttpResponse responseTwo = response;之后

一些错误得到了改变

07-29 23:26:07.073  16242-17021/com.example.kange1.bert D/UploadToServerActivity﹕ [ 07-29 23:26:07.073 16242:17021 W/System.err ]
java.lang.IllegalStateException: Content has been consumed
07-29 23:26:07.073  16242-17021/com.example.kange1.bert W/System.err﹕ at org.apache.http.entity.BasicHttpEntity.getContent(BasicHttpEntity.java:89)
07-29 23:26:07.073  16242-17021/com.example.kange1.bert W/System.err﹕ at org.apache.http.conn.BasicManagedEntity.getContent(BasicManagedEntity.java:105)
07-29 23:26:07.073  16242-17021/com.example.kange1.bert W/System.err﹕ at com.example.kange1.bert.UploadToServerActivity.uploadToServer(UploadToServerActivity.java:200)
07-29 23:26:07.073  16242-17021/com.example.kange1.bert W/System.err﹕ at com.example.kange1.bert.UploadToServerActivity$1$1.run(UploadToServerActivity.java:122)
07-29 23:26:07.073  16242-17021/com.example.kange1.bert W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

【问题讨论】:

  • HttpPost 已弃用。您不止一次地使用响应。这就是为什么你得到 excpetion
  • @Raghunandan// 如果我做类似“HttpResponse responseTwo = response”的东西并使用它而不是第二个语句的响应,那会解决我的问题吗?
  • 是的。试试吧。但是你不应该使用HttpClient。它已弃用
  • @Raghunandan// 即使在那之后我仍然有同样的问题。请问你不使用HttpClient是什么意思?我想我在这里只用过一次。我从我的其他活动中获得了这部分代码,它适用于其他活动。 //其实我现在发现有些错误不一样了。
  • 知道了!事实证明还有许多其他问题需要解决,但至少,我没有看到更多 IllegalStateException: Content has been used 错误。非常感谢您的帮助!!

标签: android


【解决方案1】:

为了简单快速的结果,我建议Android Asynchronous Http Client

例如:添加此依赖项

dependencies {
  compile 'com.loopj.android:android-async-http:1.4.8'
}

还有

public void uploadToServer(){
        AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
        RequestParams requestParams = new RequestParams();
        imageData = Base64.encodeToString(img, Base64.DEFAULT);
        String xDat = xPoint.toString();
        String yDat = yPoint.toString();
        requestParams.put("imageData" , imageData);
        requestParams.put("xData" , xDat);
        requestParams.put("yData" , yDat);
        asyncHttpClient.post(urlServer , requestParams , new JsonHttpResponseHandler(){

            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                //Call back  if your response is JSONObject
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                //Failure callback
            }


            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
                //Call back if your response is JSONArray
            }
        });
    }

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多