我正在尝试创建http请求并将数据发送到我的php服务器。为此,我使用loopj库的android-async-http。事情进展顺利,但是当我开始从我的本地数据库上传大约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)
不确定如何解决这个问题?
以下是我正在尝试的代码:
我正从循环中的本地数据库中提取数据我正在调用方法。像这样的东西:
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);
}
}
有人可以指导我如何解决这个问题吗?是否有比上面更好的方式来上传大文本?
谢谢!
答案 0 :(得分:0)
让我们先看看操作系统和HTTP是如何工作的:
当我们向全世界发送数据时,我们的操作系统基本上是发送者权利..!
因此,当我们发送大数据时,操作系统会使用预定义的大小生成数据块然后发送到世界(服务器)。
现在让我们看看HTTP如何处理这些数据:
缓冲数据直到数据发送完成。
完成整个大数据的发送后,转到
进一步处理数据。
因此,虽然我们的操作系统以块的形式发送数据,但它不会以块的形式处理 ...
在您的情况下:您正在向服务器发送大数据。您的操作系统可以发送它,甚至服务器也可以接收它,但(可能是)HTTP或服务器无法处理它。
解决方案是:如果您的数据是独立的,那么最好的方法就是以服务器可以处理它的数据块发送数据。
在您的情况下,数据是独立的,因此您可以一次读取并发送一些记录到服务器。您可以使用循环来发送整个数据。
编辑:
Bingo ......这不是服务器错误!
查看您的日志,它告诉它无法创建线程。
AsyncTask is a thread internally.
由于内存较少,Android的进程内存分配与桌面操作系统略有不同。参见Android的进程管理视图,Android并没有为进程分配太大的内存。 / p>
您的操作系统无法处理这么多数据读取和加载HTTP请求,结果是应用程序在向全世界发送数据之前崩溃。
问题的解决方案仍然相同,只是我编辑了原因...... :)!