当前位置: 首页 > 知识库问答 >
问题:

Dalvikvm-heap增长堆(frag case)同时上传视频android

皮嘉德
2023-03-14

我在从4X设备上传视频时遇到了问题。我知道在samsung S2中只有15秒的vedio重新编码将创建一个30 mb的文件,但当我试图在php服务器上首先上传视频时,它显示了如下消息:d/dalvikvm(7638):GC_FOR_ALLOC释放263K,9%空闲12838K/14087K,暂停13ms,总计13ms I/dalvikvm-heap(7638):Grow heap(frag情况)到14.481mb用于1048592字节分配d/dalvikvm(7638):GC_FOR_ALLOC释放<1K,9%空闲13861K/15175K,暂停22ms

I know it is the memory managment concept and device memory dependent but I want a real solution for it as I am stuck here from quite a few days.
Below is my code to call and upload the video to server.

public void newmethod( String Imageurl ) throws ClientProtocolException, IOException
{
    byte[] data ; 
    int bytenumber,bufferSize,bytesRead;
    int maxBufferSize = 1*1024*1024;
      DataOutputStream dos = null;
     //File sourceFile =  searchForFileInExternalStorage("video.3gp");

     Log.e("in the method the path", ""+Imageurl);

      FileInputStream fileInputStream = new FileInputStream(Imageurl);
      bytenumber = fileInputStream.available();
      Log.e("in the method the the size of the file is", ""+bytenumber);
     // dos = new DataOutputStream(conn.getOutputStream());
      bufferSize = Math.min(bytenumber, maxBufferSize);
      data = new byte[bufferSize];
     //ProgressDialog pr = new ProgressDialog(getApplicationContext());
    // pr.addContentView(getCurrentFocus(), null);
       // read file and write it into form...
       bytesRead = fileInputStream.read(data, 0, bufferSize);

       while (bytesRead > 0) {
       // dos.write(data, 0, bufferSize);
        bytenumber = fileInputStream.available();
         bufferSize = Math.min(bytenumber, maxBufferSize);
        bytesRead = fileInputStream.read(data, 0, bufferSize);
        }

     // pr.show();


    HttpClient httpClient = new DefaultHttpClient();
    HttpPost postRequest = new HttpPost("http://67.52.165.116/Kakz/mobiles/uploadvideo");
    ByteArrayBody bab = new ByteArrayBody( data, Imageurl);
    MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    reqEntity.addPart("user_video", bab);

    FormBodyPart bodyPart=new FormBodyPart("title", new StringBody(title));
    reqEntity.addPart(bodyPart);
    bodyPart=new FormBodyPart("desc", new StringBody(description));
    reqEntity.addPart(bodyPart);
    bodyPart=new FormBodyPart("source", new StringBody("android"));
    reqEntity.addPart(bodyPart); 
    postRequest.setEntity(reqEntity);
    final HttpResponse response = httpClient.execute(postRequest);
    // FileInputStream fileInputStream = new FileInputStream(response.getEntity().getContent());


    runOnUiThread(new Runnable() {
         public void run() {

    //stuff that updates ui

             BufferedReader in = null;
            try {
                in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

            } catch (IllegalStateException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
                String line = null;

    try {
        while((line = in.readLine()) != null) {
            System.out.println(line);

            titleText.setText("");
            descriptionText.setText("");
          //  Toast.makeText(getApplicationContext(), "Video Uploaded successfully", Toast.LENGTH_LONG).show();

            if (line.equalsIgnoreCase("Its too Heavy")) {
            //  pr.dismiss();
                // titleText.setText("");
                //descriptionText.setText("");
                Toast.makeText(getApplicationContext(), "Video size is too heavy", Toast.LENGTH_LONG).show();

            }

            else if (line.equalsIgnoreCase("Error")) {
            //  pr.dismiss();
                // titleText.setText("");
                //descriptionText.setText("");
                Toast.makeText(getApplicationContext(), "Error uploading video", Toast.LENGTH_LONG).show();


            }

            else  if (line.equalsIgnoreCase("Uploaded")) {
                //pr.dismiss();
                 //titleText.setText("");
                //descriptionText.setText("");
                Toast.makeText(getApplicationContext(), "Video uploaded successfully", Toast.LENGTH_LONG).show();

            }

        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
         }
});

Please let me know that how I should manage the code to get it right.
Any help would be appreciated ASAP`enter code here`

共有1个答案

仲孙温文
2023-03-14

我正面临着从4X设备上传视频的问题。

这不是问题。这是正常的行为,当您正在做非常高的成本操作(一个或多个)。您的堆的大小(隐式确定)在一个时刻是不够的,所以它需要增长。这是平等的行为,你应该如何写入清单

android:largeHeap="true"

这个财产不起作用。当堆需要更大的大小时,它会自己长大--当它需要的时候。这条消息通常会在您没有太多内存时显示。

GC_FOR_ALLOC释放263K,9%释放12838K/14087K,暂停13ms,总计13ms I/dalvikvm-heap(7638)

这里您只有9%的内存和堆需要增长。通常情况下,当alloc小于10%时会发生这种情况,并且不管您是否使用线程,一旦它是一个高成本的操作。并且当您的堆大小将达到一个“临界点”时,应用程序将自动停止,因为安全原因和VM。

一个可能的解决方案是,您需要将您的文件拆分成更小的块,然后逐个上传。

 类似资料:
  • 我正在用for循环中的对象组成一个JSON文件 当传输到JSON文件的数据量增加时,我在logcat中看到以下错误: I/dalvikvm-heap:将heap(frag case)增长到16.159MB,用于1490086字节的分配 数据类: 编辑: 我应该补充一点,我在3台手机上测试了这个案例(2台三星的,1台华为的),问题只出现在华为身上

  • 接口说明 上传视频文件 API地址 POST /api/marker/1.0.0/uploadVideo 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 dataGuid string form 是 场景GUID file string form 是 视频文件 响应字段说明 参数 类型 说明 mp4UploadPath String 视频文件上传地址 响应成功示例 { "

  • 用户通过视频上传、管理视频、获取代码,实现本地视频在制定网站播放。 2.1视频上传 进入视频页面,点击上传视频 按钮,在弹出的页面点击添加视频 : 1)选择视频“分类”,添加视频“标签”(选填); 2)点击【添加视频】或者【选择文件并上传】按钮选择本地一个或多个视频,点击确认即开始视频上传;或者在本地选择一个或多个视频,将视频拖拽到视频上传区,即可进行视频上传; 3)上传过程中点击视频上传或者取消

  • 堆(heap)又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。回忆一下,在队列中,我们可以进行的限定操作是dequeue和enqueue。dequeue是按照进入队列的先后顺序来取出元素。而在堆中,我们不是按照元素进入队列的先后顺序取出元素的,而是按照元素的优先级取出元素。 这就好像候机的时候,无论谁先到达候机厅,总是头等舱的乘客先登机,然后是商务舱的乘客,最后是

  • 对此有什么建议吗?我做错了什么?为什么不能帮助我减少字节分配?

  • Spark API 中所有的 Flash 接口需要 Flash 插件的版本在 10.1 以上才有效,使用前请确保 Flash 插件版本符合要求。 在上传视频的过程中,不用与 Spark 平台进行 HTTP 通信,使用 JavaScript 和 Spark 平台提供的 Flash 进行交互即可完成。关于如何在网页中嵌入 Flash 以及如何和 Flash 进行交互,请参阅附录 2。上传接口用到的所有