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

مشکل در ترد

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

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

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

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

 

لطفا کمک کنید

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

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

 

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

کد شما به نظر من از پایه مشکل داره! به نظر میاد شما با این کد هیچوقت نتونی اطلاعات رو به درستی دریافت کنی ، بهتره از 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 سال پیش
0 0

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

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

 

کد کامل:

 

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();

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

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