آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

Vampire  11 سال پیش  11 سال پیش
0 0

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

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

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

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

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

تشکر.

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

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 سال پیش
0 0

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

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

 

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

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