هنگ کردن و سرعت پایین با وجود استفاده از thread در ارتباط با سرور و اینترنت
با سلام دوستان گرامی.
من آموزش thread ها رو دیدم و برای برنامه ، زمانی که یک ریکوئست http میخواد ارسال بشه یک thread نوشتم ولی مثلاً وقتی روی دکمه کلیک میشه، چند لحظه نارنجی می مونه و بعد از دریافت پاسخ از سرور اوکی میشه.
یعنی thread مشکل رو حل نکرده !
و برای thread هم از نوع thread عادی و thread روی UI هم استفاده کردم ولی مشکل حل نشده
مشکل از کجاست به نظر شما و چطوری حل میشه؟
تشکر.
final pd=new ProgressDialog(register.this);
pd.setMessage("در حال ارسال اطلاعات به سرور");
pd.show();
final Timer tm=new Timer();
tm.scheduleAtFixedRate(new TimerTask(){
public void run() {
runOnUiThread(new Runnable(){
public void run() {
if(!res.equals("")){
pd.cancel();
Toast.makeText(getApplicationContext(), "متن نمایش دهنده", Toast.LENGTH_LONG).show();
res="";
tm.cancel();
}
}
});
}
}, 1, 1000);
بین کد بالا به دردت می خوره
اول از همه یه ProgressDialog رو استارت می کنی
بعد یه تایمر رو براش استارت میزنی
و بهش میگی هر یک ثانیه یک بار داخل حلقه رو چک بکنه
وببینه شرط ایف در چه حاله
هر موقع شرط ایف مخالف با تهی بود اول از همه تایمر رو از کار بندازه
بعدم پروگرس رو
چون تایمر یه حلقه مادام هستش
این هم کدی که استفاده کردم و مشکل داره.
وقتی که سرعت اینترنت کاربر کم باشه کلاً گوشی هنگ میکنه و تا زمانی که timeout نده یا پاسخ دریافت نشه گوشی کلاً هنگ میکنه.
لطفاً اگر می دونین چطوری میشه حلش کرد بگین.
یه سری نتیجه هم توی stack پیدا کردم :
http://stackoverflow.com/questions/12890404/slow-httppost-request-on-android
http://stackoverflow.com/questions/12451687/http-requests-with-httpclient-too-slow
http://stackoverflow.com/questions/3046424/http-post-requests-using-httpclient-take-2-seconds-why?rq=1
ولی نتونستم کدش رو درست کنم.
لطفاً اگر می دونین باید چکارش کرد بگین.
کلاس وب سرویس :
public class Webservice {
public static String readUrl(String url, ArrayList<NameValuePair> params) {
try {
HttpClient client = new DefaultHttpClient();
HttpPost method = new HttpPost(url);
if (params != null) {
method.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
}
HttpResponse response = client.execute(method);
InputStream inputStream = response.getEntity().getContent();
String result = convertInputStreamToString(inputStream);
return result;
}
catch (ClientProtocolException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
private static String convertInputStreamToString(InputStream inputStream) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder builder = new StringBuilder();
String line = "";
while ((line = reader.readLine()) != null) {
builder.append(line);
}
return builder.toString();
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
===
بررسی وضعیت آنلاین بودن یا نبودن توسط تابع isonline
public boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
try {
URL url = new URL("http://google.com");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(3000);
urlc.connect();
if (urlc.getResponseCode() == 200) {
return new Boolean(true);
}
}
catch (MalformedURLException e1) {
e1.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
===
و کد اصلی برنامه :
runOnUiThread(new Runnable() {
public void run() {
if (isOnline()) {
query = null;
try {
query = URLEncoder.encode(contString, "utf-8");
}
catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
runOnUiThread(new Runnable() {
public void run() {
runOnUiThread(new Runnable() {
public void run() {
pasokh = Webservice.readUrl("http://website?q=" + query, null);
}
});
if (pasokh != null) {
try {
JSONArray tasks = new JSONArray(pasokh);
for (int i = 0; i < tasks.length(); i++) {
JSONObject task = tasks.getJSONObject(i);
String pm = task.getString("q");
// pm >> اضافه شدن پاسخ دریافت شده به لیست ویو و غیره
return;
}
}
catch (JSONException e) {
e.printStackTrace();
}
}
}
});
} else {
pasokh.setText("اینترنتت رو روشن کن");
}
}
});
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .