بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

هنگ کردن و سرعت پایین با وجود استفاده از thread در ارتباط با سرور و اینترنت

مدیریت گفتگو
Vampire 11 سال پیش
آخرین تغییر: 11 سال پیش

با سلام دوستان گرامی.

من آموزش thread ها رو دیدم و برای برنامه ، زمانی که یک ریکوئست http میخواد ارسال بشه یک thread نوشتم ولی مثلاً وقتی روی دکمه کلیک میشه، چند لحظه نارنجی می مونه و بعد از دریافت پاسخ از سرور اوکی میشه.

یعنی thread مشکل رو حل نکرده !

و برای thread هم از نوع thread عادی و thread روی UI هم استفاده کردم ولی مشکل حل نشده

مشکل از کجاست به نظر شما و چطوری حل میشه؟

تشکر.

نظرات

Vampire 11 سال پیش
دوستان یه کمکی می کنید؟ هیچ جوری این مشکل حل نمیشه. تا پاسخ از سمت سرور دریافت نشه برنامه به ادامه کار نمیره.
وحید 11 سال پیش
من هم چنین مشکلی داشتم. حتی تو برودکست تعریفش کرده بودم اما وقتی کاربر گوشیش رو روشن می کرد و سرعت اینترنتش پایین بود کلا گوشی هنگ می کرد چون تو برودکست ها نوشته بودمش. کلا برش داشتم :) و در جای مخصوص خودش قرارش دادم.
MyNewName 11 سال پیش
دوست عزیز شما commands.readdata رو در thread بزار مابقیشو خارج از thread اگه کدتو بدی بهتر میشه راهنمایی کرد

پاسخ‌ها 2

raeesi 11 سال پیش

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 رو استارت می کنی
بعد یه تایمر رو براش استارت میزنی
و بهش میگی هر یک ثانیه یک بار داخل حلقه رو چک بکنه
وببینه شرط ایف در چه حاله
هر موقع شرط ایف مخالف با تهی بود اول از همه تایمر رو از کار بندازه
بعدم پروگرس رو
چون تایمر یه حلقه مادام هستش

نظرات

Vampire 11 سال پیش

این هم کدی که استفاده کردم و مشکل داره.

وقتی که سرعت اینترنت کاربر کم باشه کلاً گوشی هنگ میکنه و تا زمانی که 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("اینترنتت رو روشن کن");
}
}
});

 

نظرات

XXXXXXX 11 سال پیش
میتوتی از کتابخانه Volley استفاده کنی . کار باهاش راحته.
شما داری تو thread UI برای اتصال به اینترنت استفاده میکنی که نباید این کار رو انجام بدی .
MyNewName 11 سال پیش
دوست عزیز شما webservice رو در runOnUiThread اجرا کردی ! خب مشخصا براتون کار نمی کنه این خط pasokh = Webservice.readUrl( لینک + query, null); باید بعد از دستور if اول قرار بگیره
raeesi 11 سال پیش
می تونی از ماژول وب سرویس استاد استفاده بکنی به نظرم کاملترین کدها رو داره

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .