با سلام
من از کد زیر برای بررسی اتصال به اینترنت استفاده میکنم:
کد:
public void ShowAlertDialog() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
alertDialog.setTitle(R.string.nettitle);
alertDialog.setMessage(R.string.netmessage);
alertDialog.setIcon(R.drawable.ic_launcher);
// Setting Positive "Yes" Button
alertDialog.setPositiveButton(R.string.netyes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
new NetCheck().execute();
}
});
// Setting Negative "NO" Button
alertDialog.setNegativeButton(R.string.netno,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Write your code here to invoke NO event
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
/**
* Async Task to check whether internet connection is working.
**/
private class NetCheck extends AsyncTask<String,String,Boolean>
{
private ProgressDialog nDialog;
@Override
protected void onPreExecute(){
super.onPreExecute();
nDialog = new ProgressDialog(MainActivity.this);
nDialog.setTitle("لطفاً صیر کنید");
nDialog.setMessage("بررسی اتصال به اینترنت");
nDialog.setIndeterminate(false);
nDialog.setCancelable(true);
nDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "بستن", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
nDialog.show();
}
/**
* Gets current device state and checks for working internet connection by trying .
**/
@Override
protected Boolean doInBackground(String... args){
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
try {
URL url = new URL("http://bing.com");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(3000);
urlc.connect();
if (urlc.getResponseCode() == 200) {
return true;
}
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false;
}
@Override
protected void onPostExecute(Boolean th){
if(th == true){
nDialog.dismiss();
startActivity(new Intent(MainActivity.this, screen2.class));
}
else{
nDialog.dismiss();
ShowAlertDialog();
}
}
}
حال من میخواهم دو دکمه در دو اکتیویتی مجزا بسازم که زمانی روی هر یک از آن ها کلیک شد این کد اجرا شود. آیا راهی است که تنها با یکبار نوشتن این کد (به صورت Global یا روش دیگر) و فراخوانی آن در اکتیویتی ، بررسی اتصال به اینترنت انجام شود؟ زیرا دوباره قرار دادن این کد در چند اکتیویتی حجم برنامه را بالا میبرد و باعث غیر مهندسی شدن آن میشود.
سلام.
شما باید یک کلاس (class) بسازید که حاوی کدهای فوق باشد (مثلا کدها را در یک روش (method) از آن کلاس قرار می دهید)، سپس در هر Activity که قصد دارید آن کد اجرا شود، ابتدا یک شیء (object) از آن کلاس (class) می سازید و سپس روش (method) مورد نظر از شیء را اجرا می کنید (که از کلاس به ارث برده است). در مورد ساخت یک کلاس (class) برای پروژه اندروید، کلید زیر را بخوانید :
http://www.kelidestan.com/keys/keys.php?key=342
البته در کلید فوق، Context مربوط به Activity را هم به کلاس می فرستیم، اما اگر کدها نیازی به Context ندارند، می توانید بخش مربوط به دریافت Context را حذف کنید.
من فکر میکنم در این کد نیاز به تشخیص اکتیویتی است تا کد در آن اجرا شود:
کد:
AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
________________________________________________________________
nDialog = new ProgressDialog(MainActivity.this);
امکانش است که بشود بهجای MainActivity، اکتیوتی که نیاز به نمایش پیغام است به صورت خودکار یا دستی انتخاب شود؟
من برنامه نویسی اندروید را تازه شروع کردهام؛ اگر میشود کمی بیشتر راهنمایی کنید.
با تشکر
بله برخی کدها نیاز به شناسایی Activity دارند و در این مواقع، با ارسال Context مربوط به Activity به آن کلاس (class)، با استفاده از Context می تواند آن Activity را شناسایی کند.
من طی یکی دو روز آینده، یک مبحث در این مورد می نویسم تا دقیقا متوجه شوید که کدنویسی باید به چه صورت باشد. هر وقت آماده شد، لینک آن را در همین موضوع قرار می دهم.
همان طور که قول داده بودم، یک مبحث در مورد ساخت کلاس (class) جدید در پروژه اندروید براتون نوشتم (همچنین شرح چگونگی شناسایی Activity) :
http://www.kelidestan.com/keys/keys.php?key=2796
که در مورد اجرای متعدد یک سری کد در Activity های مختلف با استفاده از یک کلاس (class) کمکتون میکنه. در مورد شناسایی Activity نیز در انتهای همان کلید، توضیحاتی داده شده است. سعی کردم با حوصله مبحث نوشته شود تا تمامی موارد مهم در آن ذکر شود.
ممون، خیلی کمک کردید. امیدوارم سایتتان همیشه جزء بهترینها باشد.
من طبق آموزش شما کدها را قرار دادم:
کد:
public class ConnectionDetector extends TestCase {
private Context context;
public ConnectionDetector (Context context) {
this.context = context;
}
public void ShowAlertDialog() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this.context);
alertDialog.setTitle(R.string.nettitle);
alertDialog.setMessage(R.string.netmessage);
alertDialog.setIcon(R.drawable.ic_launcher);
// Setting Positive "Yes" Button
alertDialog.setPositiveButton(R.string.netyes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
new NetCheck().execute();
}
});
// Setting Negative "NO" Button
alertDialog.setNegativeButton(R.string.netno,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Write your code here to invoke NO event
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
private class NetCheck extends AsyncTask<String,String,Boolean>
{
/**
* Gets current device state and checks for working internet connection by trying .
**/
@Override
protected Boolean doInBackground(String... args){
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null) {
ShowAlertDialog();
return false;
} else
startActivity(new Intent(this.context, screen2.class));
return true;
}
}
}
اما eclips برای getSystemService و خط startActivity(new Intent(this.context, screen2.class)); خطا میدهد.
کد زیر را در نظر بگیرید :
کد:
startActivity(new Intent(this.context, screen2.class));
باید به کد زیر تبدیل شود :
کد:
context.startActivity(new Intent(context, screen2.class));
که در آن، به جای startActivity ، عبارت context.startActivity را نوشته ایم.
همچنین کد زیر را در نظر بگیرید :
کد:
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
باید به کد زیر تبدیل شود :
کد:
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
که در آن، به جای getSystemService ، عبارت context.getSystemService را نوشته ایم، همچنین به جای Context ، عبارت context را نوشته ایم.
در واقع در چگونگی اشاره به Context متناظر با Activity مشکل داشتند.
قبل از توضیحات جدید ابتدا چند نکته را تذکر بدم :
1- چند ارسال را حذف یا تصحیح کردم چون راهنمایی آنها غلط بود.
2- دو حالت private و public تفاوتی در این حالت نداشتند.
3- لطفا در صفحه اصلی انجمن، در ابتدای صفحه، راهنما در مورد صحیح نوشتن کدها در ارسال را بخوانید و با آن شیوه کدها را در ارسال ها بنویسید (کدهاتون به هم ریخته هستند و خوندنشون واقعا سخته).
4- بنده یک پروژه اندروید ساختم تا خودم مشکلات را بررسی کنم. کدهای کلاس را به صورت زیر نوشتم (نام کلاس من با مال شما فرق دارد، مراقب این تفاوت ها باشید) :
کد:
package com.kelidestan.newclass;
import junit.framework.TestCase;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.widget.Toast;
public class MyClass extends TestCase {
public Context context;
public MyClass (Context context) {
this.context = context;
}
public void ShowAlertDialog() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this.context);
alertDialog.setTitle("string");
alertDialog.setMessage("string");
alertDialog.setIcon(R.drawable.ic_launcher);
// Setting Positive "Yes" Button
alertDialog.setPositiveButton("string",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
new NetCheck().execute();
}
});
// Setting Negative "NO" Button
alertDialog.setNegativeButton("string",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Write your code here to invoke NO event
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
public class NetCheck extends AsyncTask<String,String,Boolean>
{
/**
* Gets current device state and checks for working internet connection by trying .
**/
@Override
protected Boolean doInBackground(String... args){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null) {
ShowAlertDialog();
return false;
} else
context.startActivity(new Intent(context, MyActivity.class));
return true;
}
}
}
در این حالت برنامه eclipse هیچ پیام خطایی نمایش نمی دهد. با توجه به اینکه خیلی گرفتارم، اجرا کردن برنامه اندروید را به عهده خودتان می گذارم. اگر بازم مشکلی بود، این بار به طور صحیح، کدهای کلاس و همچنین چگونگی اجرا کردن آن در Activity را در ارسالتان قرار بدهید تا بررسی کنم (لطفا کدها را با همان روشی که عرض کردم در ارسال قرار بدهید).
در ارسال های قبلی (آنهایی که حذف کردم) کمی شتاب زده پاسخ دادم که به این دلیل بود که همزمان در حال بررسی نرم افزاری دیگر بودم (حسابی فکرم مشغول بود) و نمی توانستم کدها را به طور دقیق تست کنم، به هر حال امیدوارم مشکلتان با این ارسال دیگر حل بشود.
کد به درستی اجرا میشود، از کمکتان بشیار متشکرم.
حال چگونه میتوانم کل این کلاس را در اکتیویتی دلخواه اجرا کنم؟
من کدهایتان را در پروژه اندروید تست کردم (این بار برای اینکه ببینم درست اتصال اینترنت رو تشخیص میده یا نه). با مواردی که مورد بحث ما بود، مشکلی نداشت و در حالتی هم که به اینترنت متصل بودیم، درست کار می کرد، اما برای حالتی که من گوشیم را از شبکه wireless قطع می کردم، برنامه force close می داد. چون کدها شبیه کدهایی بود که من در سایت قرار داده بودم، قبلا فکر می کردم که عینا آنها را در پروژه اندروید خود قرار داده اید، اما اینگونه نبود و با تغییر دادن آنها، مشکلاتی به وجود آمده بود. بنابراین بنده بر اساس کلید زیر، کدها را تکمیل کردم :
http://www.kelidestan.com/keys/keys.php?key=2408
که البته قبلا اصل کدهای آن را در کلید زیر شرح داده بودیم (روش اول در این کلید) :
http://www.kelidestan.com/keys/keys.php?key=287
بنابراین بنده کل پروژه اندرویدی که ساختم و آن را در دو حالت وصل به اینترنت و عدم اتصال به اینترنت تست کرده ام را برایتان در پیوست این ارسال قرار دادم تا خودتان کدهای آن را بررسی کنید (نحوه اجرای کدهای آن مشخص است). فایل apk ساخته شده از آن را هم پیوست کرده ام.
اما بد نیست که خود کدها رو هم اینجا بنویسم :
کدهای کلاس (نام آن با کلاس شما فرق دارد) :
کد:
package com.kelidestan.newclass;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import junit.framework.TestCase;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.widget.Toast;
public class MyClass extends TestCase {
public Context context;
public MyClass (Context context) {
this.context = context;
}
public void ShowAlertDialog() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this.context);
alertDialog.setTitle("Title");
alertDialog.setMessage("No Internet");
alertDialog.setIcon(R.drawable.ic_launcher);
// Setting Positive "Yes" Button
alertDialog.setPositiveButton("Yes (repeat check internet)",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
new NetCheck().execute();
}
});
// Setting Negative "NO" Button
alertDialog.setNegativeButton("No (cancel)",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Write your code here to invoke NO event
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
/**
* Async Task to check whether internet connection is working.
**/
private class NetCheck extends AsyncTask<String,String,Boolean>
{
private ProgressDialog nDialog;
@Override
protected void onPreExecute(){
super.onPreExecute();
nDialog = new ProgressDialog(context);
nDialog.setTitle("Checking Network");
nDialog.setMessage("Loading..");
nDialog.setIndeterminate(false);
nDialog.setCancelable(true);
nDialog.show();
}
/**
* Gets current device state and checks for working internet connection by trying Google.
**/
@Override
protected Boolean doInBackground(String... args){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
try {
URL url = new URL("http://www.google.com");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(3000);
urlc.connect();
if (urlc.getResponseCode() == 200) {
return true;
}
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false;
}
@Override
protected void onPostExecute(Boolean th){
if(th == true){
nDialog.dismiss();
Toast.makeText(context.getApplicationContext(), "Your device is connected to internet !", Toast.LENGTH_SHORT).show();
context.startActivity(new Intent(context, MyActivity.class));
// new GetData().execute();
}
else{
nDialog.dismiss();
ShowAlertDialog();
}
}
}
public void CheckInternet() {
new NetCheck().execute();
}
}
کدهای Activity اصلی برنامه اندروید :
کد:
package com.kelidestan.newclass;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyClass myClass = new MyClass(this);
myClass.CheckInternet();
}
}
کدها را با دقت بررسی کنید. همچنین برنامه اندروید را هم در دو حالت اتصال و عدم اتصال به اینترنت چک کنید.
در کدی که قرار دادید، در صورت اتصال دستگاه به اینترنت
MyActivity اجرا میشود. اگر بخواهیم که در هر اکتیویتی که اتصال به اینترنت بررسی میشود این خط از کد تغییر کند و اکتیویتی مورد نظر ما اجرا شود، چه باید کرد؟ ( برای مثال با باز نمودن هر اکتیویتی، در صورت برقراری ارتباط با اینترنت خود اکتیویتی اجرا شود)
با تشکر از شما بابت وقتی که صرف پاسخ دادن میکنید
(۱۳۹۳/۱۰/۰۶, ۰۳:۲۷ ب.ظ)'ramtin2080' نوشته: [ -> ]در کدی که قرار دادید، در صورت اتصال دستگاه به اینترنت MyActivity اجرا میشود. اگر بخواهیم که در هر اکتیویتی که اتصال به اینترنت بررسی میشود این خط از کد تغییر کند و اکتیویتی مورد نظر ما اجرا شود، چه باید کرد؟ ( برای مثال با باز نمودن هر اکتیویتی، در صورت برقراری ارتباط با اینترنت خود اکتیویتی اجرا شود)
با تشکر از شما بابت وقتی که صرف پاسخ دادن میکنید
کد مورد نظر را با توجه به آنچه شما خواسته بودید (کدی که گذاشتید)، نوشتم. یعنی شما می خواستید (بر اساس کد اولیه شما می گویم) که چک شود که اینترنت متصل است یا نه، اگر متصل بود، به Activity دیگری منتقل شود (اگر هم متصل نبود که یک Dialog نمایش داده شود). اکنون اگر شما هدفتان تنها چک کردن اتصال به اینترنت است، آن خط از کدها را حذف کنید تا تنها یک پیام کوتاه با Toast نمایش داده شود (در صورت اتصال به اینترنت) و در همان Activity باقی بمانید.
اگر هم حتما باید به Activity های مختلف بروید، می توانید نام Activity بعدی را به آن ارسال کنید (یک ورودی بر اساس نام Activity بعدی دریافت می کند).
اصولی تر این است که ابتدای اجرای هر Activity ، چک کنید که کاربر به اینترنت متصل است یا نه، اگر متصل نبود که پیامی نمایش داده شود و ادامه کدهای Activity اجرا نشوند، اگرهم متصل بود که کدهای Activity اجرا می شوند. مثلا می توانید تعیین کنید که اتصال به اینترنت چک شود و کلاس (class) مورد نظر، یک متغیر boolean را برگرداند که اگر true بود، کدهای Activity اجرا شوند.
در مورد ارسال نام Activity بعد میشود بیشتر توضیح دهید؟
(۱۳۹۳/۱۰/۰۶, ۰۷:۱۷ ب.ظ)'ramtin2080' نوشته: [ -> ]در مورد ارسال نام Activity بعد میشود بیشتر توضیح دهید؟
با خواندن کلید زیر، متوجه می شوید که چگونه یک مقدار (ورودی برای کلاس) را به یک کلاس (Class) ارسال کنید (نام Activity را به صورت رشته (String) به کلاس مورد نظر ارسال می کنید) :
کلید شماره 342
برای رفتن به activity جدید، با استفاده از یک رشته (تعریف نام activity با رشته)، کلید زیر را بخوانید :
کلید شماره 252
فرستادن
نام Activity را به صورت رشته به چه صورت است؟ آیا به این صورت است:
کد پیاچپی:
String StringClass = this.context;
زیرا من با قرار دادن این کد خطا دریافت میکنم.
با تشکر
کلید زیر را بخوانید (در بخش هایی از آن، در مورد تعریف ورودی برای یک کلاس (Class) توضیحاتی داده شده) :
کلید شماره 2796
سلام
پیرامون پاسخهای دوستمان میخواستم بپرسم که اگر بخواهیم علاوه بر اینکه اتصال به اینترنت در ابتدای کار بررسی شود، در حین استفاده از سایت آورده شده بوسیله وب ویو مثلا وقتی بروی لینک دیگری از سایت کلیک میکنیم اگر اینترنت قطع شود پیام بیاید(مانند اپلیکیشن سایت کلیدستان)، همچنین اگر بخواهیم بدون اینکه حتی کلیک بکنیم با قطع شدن اتصال پیام بیاید باید چکار کنیم؟