Java Asynctask doInBackground在实际设备上太慢
我正在开发一个android应用程序,我是线程新手,如果我的问题很愚蠢,我很抱歉,我使用了AsyncTask的doInBackground方法将流转换为字符串,然后在onPostExecute方法中,应用程序将生成JSON对象 我在Emulator(API 17)中启动了我的应用程序,它也启动了Prefict,但当我在智能手机(galaxy s5)上启动它时,时间太长了,可能需要10或15秒。 我认为这种方法是造成这个问题的原因 这是我的主要课程,在这里完成所有工作: 这是我调用Asynctask类并使用POST方法发送参数的地方:Java Asynctask doInBackground在实际设备上太慢,java,android,android-asynctask,Java,Android,Android Asynctask,我正在开发一个android应用程序,我是线程新手,如果我的问题很愚蠢,我很抱歉,我使用了AsyncTask的doInBackground方法将流转换为字符串,然后在onPostExecute方法中,应用程序将生成JSON对象 我在Emulator(API 17)中启动了我的应用程序,它也启动了Prefict,但当我在智能手机(galaxy s5)上启动它时,时间太长了,可能需要10或15秒。 我认为这种方法是造成这个问题的原因 这是我的主要课程,在这里完成所有工作: 这是我调用Asynctas
final ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("register_number", phoneNumber.getText().toString()));
Log.i("LOG", "params hastttttttttt" + params.toString());
//
// Commands.readRegisterNumber(params);
// new readData().execute(params);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
new readData().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
} else {
new readData().execute(params);
}
@Override
protected void onPostExecute(String result) { //doInBackground khorujish ro mide be in
if (result != null) {
try {
G.registerNumber.clear();
JSONObject object = new JSONObject(result);
StructRegisterNumber structRegisterNumber = new StructRegisterNumber();
structRegisterNumber.status = object.optString("status");
structRegisterNumber.code = object.optString("code");
structRegisterNumber.message = object.optString("message");
G.registerNumber.add(structRegisterNumber);
StructRegisterNumber registerNumber = G.registerNumber.get(0);
if (registerNumber.status != null && registerNumber.code != null) {
if (Integer.parseInt(registerNumber.status) == -1) {
Intent intent = new Intent(ActivityRegisterNumber.this, ActivityRegisterCode.class);
ActivityRegisterNumber.this.startActivity(intent);
}
}
progressDialog.dismiss();
}
catch (JSONException e) {
e.printStackTrace();
}
} else {
progressDialog.dismiss();
}
}
在实际设备上速度较慢的原因有很多:
<>这并不完全解决你的问题,但是由于你只是简单地从你的异步任务中的网络上加载数据,你应该考虑使用网络库,比如截击,这使得生活变得简单多了。他们甚至支持Gson,可以自动将返回的Json解析为对象 文件: 图书馆本身:
当我读到你在“午餐”节目时,我咯咯地笑了起来:)对不起,我写得太快了,我犯了一些错误:)我的wifi范围和可用性很好,我在几部智能手机上安装了我的应用程序,它们都有同样的问题,运行doInBackground方法需要很长时间,我的代码或AsyncTask类中是否有任何问题?您是否尝试过DDMS中的网络统计信息?它可能会帮助您了解网络请求期间发生的情况。
@Override
protected String doInBackground(List<? extends NameValuePair>... params) {
List<? extends NameValuePair> param = params[0];
try {
HttpClient client = new DefaultHttpClient();
HttpPost method = new HttpPost("http://192.168.10.110:2233/api/register");
method.setEntity(new UrlEncodedFormEntity(param));
HttpResponse response = client.execute(method);
InputStream inputStream = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder builder = new StringBuilder();
String line = "";
while ((line = reader.readLine()) != null) {
builder.append(line);
}
result = builder.toString();
}
catch (IOException e) {
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(String result) { //doInBackground khorujish ro mide be in
if (result != null) {
try {
G.registerNumber.clear();
JSONObject object = new JSONObject(result);
StructRegisterNumber structRegisterNumber = new StructRegisterNumber();
structRegisterNumber.status = object.optString("status");
structRegisterNumber.code = object.optString("code");
structRegisterNumber.message = object.optString("message");
G.registerNumber.add(structRegisterNumber);
StructRegisterNumber registerNumber = G.registerNumber.get(0);
if (registerNumber.status != null && registerNumber.code != null) {
if (Integer.parseInt(registerNumber.status) == -1) {
Intent intent = new Intent(ActivityRegisterNumber.this, ActivityRegisterCode.class);
ActivityRegisterNumber.this.startActivity(intent);
}
}
progressDialog.dismiss();
}
catch (JSONException e) {
e.printStackTrace();
}
} else {
progressDialog.dismiss();
}
}