مشکل در ترد
سلام دوستان من یه جیسون رو دریافت میکنم ولی در هنگام دریافت جسون برنامه چند ثانیه هنگ میکنه تا اطلاعات از اینترنت دریافت شه منم برای جلوگیری از هنگ کد هارو در ترد قرار دادم ولی کد ها در ترد مشکل دارن
(کد ها در ترد فورس کلوز میدن حتی جسون هم دریافت میشه ولی معلوم نی فورس کلوز چیه)
لاگ کت هم خالیه
لطفا کمک کنید
کد های من اینا هستن و هنوز فورس کلوز میدن کمک کنید
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();
کد شما به نظر من از پایه مشکل داره! به نظر میاد شما با این کد هیچوقت نتونی اطلاعات رو به درستی دریافت کنی ، بهتره از 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();
}
});
ضمن تشکر از شما مشکل به صورت کامل حل شد
اگه یه اموزشم از اون کتاب خونه ای که ازش استفاده میکنی تو انجمن بزاری ممنون میشم
کد کامل:
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();
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .