我正在尝试创建http请求并将数据发送到我的php服务器。为此,我使用android-async-http由loopj库。事情都很好,但当我开始上传数据,大约1600记录从我的本地数据库。我得到内存泄漏错误:
12917-12917/com.ylg.all E/art﹕ Throwing OutOfMemoryError "pthread_create (1040KB stack) failed: Try again"
07-29 21:56:51.852 12917-12917/com.ylg.all E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.ylg.all, PID: 12917
java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Try again
at java.lang.Thread.nativeCreate(Native Method)
at java.lang.Thread.start(Thread.java:1063)
at org.apache.http.impl.conn.tsccm.AbstractConnPool.enableConnectionGC(AbstractConnPool.java:145)
at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.createConnectionPool(ThreadSafeClientConnManager.java:125)
at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager.<init>(ThreadSafeClientConnManager.java:103)
at com.loopj.android.http.AsyncHttpClient.<init>(AsyncHttpClient.java:238)
at com.loopj.android.http.AsyncHttpClient.<init>(AsyncHttpClient.java:177)
at com.loopj.android.http.AsyncHttpClient.<init>(AsyncHttpClient.java:147)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2894)
at android.app.ActivityThread.access$2100(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1401)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
不知道如何解决这个问题?
这是我正在尝试的代码:
我正在从本地DB内循环中提取数据,我正在调用方法。像这样:
List<TextDetails> unTextList = dbvalue.getTextData();
for (TextDetails td : unTextList)
{
String textID = td.getSerialNumber();
String textSMS = td.getText();
String textAddress = td.getFulladdress();
String textDate = td.getFulldate();
String textException = td.getExceptiontext();
textDetailsBackUpDataOnline(textID , textSMS, textAddress, textDate, textException);
}
private void textDetailsBackUpDataOnline(final String textID ,
String textSMS, String textAddress, String textDate, String textException)
{
final String uploadWebsite = url_backup_text_details;
RequestParams requestParams = new RequestParams();
requestParams.put("textSMS", textSMS);
requestParams.put("textAddress", textAddress);
requestParams.put("textDate", textDate);
requestParams.put("textException", textException);
Text_HttpClient.post(uploadWebsite, requestParams, new AsyncHttpResponseHandler()
{
@Override
public void onSuccess(int statusCode, org.apache.http.Header[] headers, byte[] responseBody)
{
Log.e("textID", "= how many times");
}
@Override
public void onFailure(int statusCode, org.apache.http.Header[] headers, byte[] errorResponse, Throwable e)
{
e.printStackTrace(System.out);
}
});
}
Text_HttpClient类有以下内容:
public class Text_HttpClient
{
private static AsyncHttpClient client = new AsyncHttpClient();
public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler)
{
client.get(url, params, responseHandler);
}
public static void post(String url, RequestParams requestParams, AsyncHttpResponseHandler responseHandler)
{
client.post(url, requestParams, responseHandler);
}
}
谁能告诉我如何解决这个问题?有没有比上面更好的方式来上传这么大的文本?谢谢!
让我们先看看操作系统和HTTP是如何工作的:
当我们向世界发送数据时,我们的操作系统基本上是一个发送者,对吧!
所以当我们发送大数据时,操作系统使用预定义的大小制作数据块,然后发送到世界(服务器)。
现在让我们看看HTTP是如何处理这些数据的:
-
缓存数据,直到数据发送完成。
-
整个大数据发送完成后转到
所以,虽然我们的操作系统发送数据块,它不处理块对…!
在您的示例中:您正在向服务器发送大数据。你的操作系统可以发送它,甚至服务器也可以接收它,但(可能)HTTP或服务器无法处理它。
解决方案是:所以最好的方式,如果你的数据是独立的,然后发送数据块,服务器可以处理它。
在您的情况下,数据是独立的,因此您可以一次读取并发送一些记录到服务器。你可以使用循环来发送整个数据。
编辑:宾果……
查看日志,提示无法创建线程
AsyncTask is a thread internally.
由于内存较少,Android对进程的内存分配与桌面操作系统有点不同。在android的进程管理视图中,android不会为一个进程分配太大的内存。
你的操作系统无法处理这么多的数据读取和加载HTTP请求,导致应用程序在向世界发送数据之前崩溃。
问题的解决方案仍然相同,只是我编辑了原因…:) !