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

مشکل در ترد

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

سلام دوستان من یه جیسون رو دریافت میکنم ولی در هنگام دریافت جسون برنامه چند ثانیه هنگ میکنه تا اطلاعات از اینترنت دریافت شه منم برای جلوگیری از هنگ کد هارو در ترد قرار دادم ولی کد ها در ترد مشکل دارن

(کد ها در ترد فورس کلوز میدن حتی جسون هم دریافت میشه ولی معلوم نی فورس کلوز چیه)

لاگ کت هم خالیه 

 

لطفا کمک کنید

نظرات

aminaryan 10 سال پیش
منم تا همین دو ساعت پیش دنبال جواب بودم که پیدا کردم. شما از چه متدی برای ارتباط با سرور استفاده میکنید؟ httpclient یا httpurlconnection یا ...؟ و اینکه کدهای ارتباط با اینترنت رو داخل یک کلاس جدا مینویسید؟
دانیال 10 سال پیش
از httpclinet. میشه جوابی که پیدا کردی رو بگی ما هم استفاده کنیم
Rabbit 10 سال پیش
جای thread از asynctask استفاده کن. فک کنم داده‌ها رو قبل از اینکه thread کارش تموم شه میخوای بخونی. ولی در asynctask میتونی داخل متد onPostExecute، وقتی که مطمئن شدی اطلاعات از اینترنت گرفته شده، باهاشون کار کنی.
دانیال 10 سال پیش
نه من از ترد برای جلوگیری از هنگ چند ثانیه ای برنامم استفاده میکنم
Rabbit 10 سال پیش
چیزی که گفتم حدس من از مشکل شما بود، شاید اشتباه کنم. همونطور که میدونید اون هنگ برای اینه که thread اصلی برنامه داره اطلاعات رو میخونه. وقتی داخل یک thread دیگه قرار میدید انگار که به یکی دیگه میگید برو اطلاعات رو برای من بخون (یک thread دیگه) ولی قبل از اینکه اون thread اطلاعات رو بیاره سعی میکنید ازشون استفاده کنید که باعث کرش میشه. ولی اگه از asynctask استفاده کنید وقتی که اطلاعات آماده شد به شما خبر میده و همون موقع میتونید کارتون رو انجام بدید.
دانیال 10 سال پیش
بله از اطلاعات استفاده نکردم کرش هم نشد فقط کد های ایسینک تسک رو بدی ممنون میشم
aminaryan 10 سال پیش
همه ی کدهایی که برای ارتباط و چک کردن جیسون استفاده کردی رو داخل ترد بزار. کد های httpclient رو هم داخل همون ترد بزار.
k112 10 سال پیش
بعضی مواقع که احتمال داره چند ترد (اصلی و فرعی) به یک منبع دست پیدا کنند! .... که چون یکی از ترد ها منبع رو میگیره ترد بعدی بخواد به اون منبع برسه یک exception پرتاب میکنه ... پس برای حل باید قفل کنید که از کلید واژه synchronized برای اینکار استفاده کنید یا از کلاس های که در اصطلاح سینکرونایزد باشد ... موفق باشید

پاسخ‌ها 3

دانیال 10 سال پیش

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

 

		new Thread(new Runnable() {
				@Override
				public void run() {
					
					
		
		
		String result = null;
		InputStream is = null;
		
		ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

		nameValuePairs.add(new BasicNameValuePair("f1","55"));
		try
		{
			HttpClient httpclient = new DefaultHttpClient();
			HttpPost httppost = new HttpPost("http://androidapp.cloudsite.ir/dd.php");
			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));
			HttpResponse response = httpclient.execute(httppost); 
			HttpEntity entity = response.getEntity();
			is = entity.getContent();

			Log.e("log_tag", "connection success ");

		}
		catch(Exception e)
		{
			Log.e("log_tag", "Error in http connection "+e.toString());
			

		}

		try{
			BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
			StringBuilder sb = new StringBuilder();
			String line = null;
			while ((line = reader.readLine()) != null) 
			{
				sb.append(line + "\n");

			}
			is.close();

			result=sb.toString();
			
			
			
			
			
			
			
		}
		catch(Exception e)
		{
			Log.e("log_tag", "Error converting result "+e.toString());

		}
					try{


						
						JSONObject object = new JSONObject(result);

						Log.e("log_tag", "ok");

						String ch=object.getString("re");

						if(ch.equals("success"))
						{
							JSONObject no = object.getJSONObject("0");


							String w= no.getString("f2");
							long e=no.getLong("f3");


							String longtostring = NumberFormat.getInstance().format(e);



							

						}


						else
						{

							
							Toast.makeText(getApplicationContext(), "دریافت اطلاعات ناموفق بود", Toast.LENGTH_SHORT).show();

						}

					}
					catch(JSONException e)
					{
						Log.e("log_tag", "Error parsing data "+e.toString());

					}


					
				}
				
				
			}).start();
		

نظرات

حمید 10 سال پیش

کد شما به نظر من از پایه مشکل داره! به نظر میاد شما با این کد هیچوقت نتونی اطلاعات رو به درستی دریافت کنی ، بهتره از async task  استفاده کنی.

همینطور باید بدونید کدهای httpClient  منقضی شدن و بهتره ازشون استفاده نکنید. توصیه میشه از کتابخانه هایی مثل volley یا OkHttp استفاده کنید.(من خودم از okHttp استفاده میکنم و باید بگم هم کار رو راحتتر و سریعتر میکنه و هم اینکه رعایت همزمانی توش راحتتره.)
اما علت کرش ! شما داری داخل تردی غیر ترد ui  عملیات toast انجام میدی، برای اینکه کرش رخ نده باید داخل handler بنویسیش ، یا اینکه به صورت زیر بنویسیش:

 runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "دریافت اطلاعات ناموفق بود", Toast.LENGTH_SHORT).show();

}
})

// واسه اینکه یه مقدار هم با خوبیهای کار با okHttp آشنا بشی کد زیر رو برات میزارم که با استفاده از okHttp  نوشته شده و خیلی هم تر و تمیز کار میکنه :

OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
Request request = new Request.Builder()
.url("http://androidapp.cloudsite.ir/dd.php")
.build();
Log.i("request: ", "request =" + request);
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "دریافت اطلاعات ناموفق بود", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
Log.i("connection :","connection failur");

Headers responseHeaders = response.headers();
for (int i = 0, size = responseHeaders.size(); i < size; i++) {
Log.i("responseHeaders: ","=" + responseHeaders.name(i) + ": " + responseHeaders.value(i));
}
String responseBody = response.body().string();
Log.i("responseBody: ","=" + responseBody);
Toast.makeText(getApplicationContext(), "اطلاعات دریافت شد!!", Toast.LENGTH_SHORT).show();


}
});

نظرات

دانیال 10 سال پیش

ضمن تشکر از شما مشکل به صورت کامل حل شد

اگه یه اموزشم از اون کتاب خونه ای که ازش استفاده میکنی تو انجمن بزاری ممنون میشم

 

کد کامل:

 

final ProgressDialog pd = new ProgressDialog(MainActivity.this);
		//pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		pd.setMessage("درحال دریافت اطلاعات از سرور");
		pd.setCancelable(false);
		pd.show();
		new Thread(new Runnable() {
				@Override
				public void run() {




					String result = null;
					InputStream is = null;

					ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

					nameValuePairs.add(new BasicNameValuePair("f1","3"));
					try
					{
						HttpClient httpclient = new DefaultHttpClient();
						HttpPost httppost = new HttpPost("http://androidapp.cloudsite.ir/dd.php");
						httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8"));
						HttpResponse response = httpclient.execute(httppost); 
						HttpEntity entity = response.getEntity();
						is = entity.getContent();

						Log.e("log_tag", "connection success ");

					}
					catch(Exception e)
					{
						Log.e("log_tag", "Error in http connection "+e.toString());


					}

					try{
						BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
						StringBuilder sb = new StringBuilder();
						String line = null;
						while ((line = reader.readLine()) != null) 
						{
							sb.append(line + "\n");

						}
						is.close();

						result=sb.toString();







					}
					catch(Exception e)
					{
						Log.e("log_tag", "Error converting result "+e.toString());

					}
					try{



						JSONObject object = new JSONObject(result);

						Log.e("log_tag", "ok");

						String ch=object.getString("re");

						if(ch.equals("success"))
						{
							JSONObject no = object.getJSONObject("0");


							final String w= no.getString("f2");
							long e=no.getLong("f3");


							final String longtostring = NumberFormat.getInstance().format(e);


							runOnUiThread(new Runnable() {
									@Override
									public void run() {
										Toast.makeText(getApplicationContext(), w, Toast.LENGTH_SHORT).show();
										Toast.makeText(getApplicationContext(), longtostring, Toast.LENGTH_SHORT).show();
										pd.cancel();
									}
								});


						}


						else
						{


							runOnUiThread(new Runnable() {
									@Override
									public void run() {
										Toast.makeText(getApplicationContext(), "دریافت اطلاعات ناموفق بود", Toast.LENGTH_SHORT).show();
										pd.cancel();

									}
								});

						}

					}
					catch(JSONException e)
					{
						Log.e("log_tag", "Error parsing data "+e.toString());

					}



				}


			}).start();

نظرات

حمید 10 سال پیش
آموزش های مربوط به volley رو دوستان زحمت کشیدند و در انجمن موجود هستش. در رابطه با okHttp هم با یه سرچ ساده در اینترنت به نتایج خوبی میرسی.

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