在Android中检测网络连接

4
我在Android上有一个应用程序,它是TCP/IP连接的客户端...这个应用程序可以接收来自GPS提供者的GPSt数据,并将其发送到我的TCP/IP连接的服务器端。
但是当没有互联网连接时,我必须将GPS数据存储在数据库中...并且一旦我再次拥有互联网连接,我必须重新启动客户端并重新连接到我的服务器并发送数据。
问题:1.如何在Android中检测互联网连接?(我的应用程序正在模拟器上运行)
2.一旦我检测到互联网连接,是否可能要求我的线程客户端重新连接到服务器?
以下是我的代码示意图:
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.client);

    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    locationListener = new MyLocationListener();



    cThread = new Thread(new ClientThread(syncToken));

    cThread.start();

    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            locationListener);
}

public void onLocationChanged(Location loc) {
        if (loc != null) {

                    latitude = (int) (loc.getLatitude() * 1E6);

                    longitude = (int) (loc.getLongitude() * 1E6);


                    }
                }



            GeoPoint p = new GeoPoint(latitude, longitude);
            // geoPointsArray.add(p);
            db.insertData1(longitude, latitude);




        }

public class ClientThread implements Runnable {
    Object syncToken;



    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);

            socket = new Socket(serverAddr, 7001);

            Log.d(" ", "Clientul s-a conect");

        } catch (UnknownHostException e) {

            System.err.println("Don't know about host");

        } catch (IOException e) {

            System.err
                    .println("Couldn't get I/O for the connection to host");
        }

        try {

            os = new ObjectOutputStream(socket.getOutputStream());

        } catch (IOException e) {


            System.out.println(e);
        }

        while (true) {


            synchronized (syncToken) {

                try {
                    syncToken.wait();

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }
            }

            if (socket != null && os != null) {

                    try {

            //send data through the socket

                    }catch (Exception e){

                        e.printStackTrace();

                    }

                    i++;

                }

            }


    }
}

编辑:

这是我所做的:

private NetworkStateReceiver mNetSateReceiver = null;

private class NetworkStateReceiver extends BroadcastReceiver

{
    @Override

    public void onReceive( Context context, Intent intent )

    {
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo info =connectivity.getActiveNetworkInfo();;

        if (info != null && info.isConnectedOrConnecting()) {


            System.out.println(" internet connection!");


        } 
        else
            System.out.println("no internet connection");



    }
}

onCreate(){



     registerReceiver( mNetSateReceiver, new IntentFilter(
                ConnectivityManager.CONNECTIVITY_ACTION ) );

        syncToken = new Object();

        cThread = new Thread(new ClientThread(syncToken));

        cThread.start();


}

 public void onDestroy(){ 

     super.onDestroy(); 

     db.close();

        unregisterReceiver( mNetSateReceiver );
 }

我知道每当我的状态连接发生变化时,我的onReceive()方法都会被调用....这意味着,在有网络连接时应该在onReceive()方法中启动线程吗?

我有些困惑,如果您能为我澄清一下这个问题,以及我应该在哪里启动您所说的意图,那就太感谢了。

1个回答

0

这个线程回答了你的问题

关于某些事情在上线时发生。您可以引发广播意图,并通过一个活动接收该意图,一旦有互联网连接就进行更新。

我希望这能帮到你。

编辑:通过广播意图,我的意思是像这样的东西。我不确定这是否是最好的解决方案,其他人可能会提供意见...

如果检测到互联网,以下意图广播可以运行。

广播意图的代码:

  Intent i = new Intent(DO_REFRESH);
  sendBroadcast(i);

接收意图的广播:

doRefreshBroadcastReceiver drbr;
...

onResume() {
  // register the refreshing complete broadcast receiver
  IntentFilter intentFilter = new IntentFilter(DO_REFRESH);
  drbr = new doRefreshBroadcastReceiver();
  registerReceiver(drbr,intentFilter);        
}

    public class doRefreshBroadcastReceiver extends BroadcastReceiver { 

        @Override
        public void onReceive(Context context, Intent intent) {

            // call method to run fetch code...
        }
    } 

关于重新启动我的线程并强制它重新连接到服务器,这有可能吗?:-S - adrian
还有一个问题是:我应该在onCreate()中验证网络连接吗?:-S - adrian
在启动线程之前运行 getActiveNetworkInfo() - wired00
我不确定所有的代码,你能不能像我提供的线程一样使用一个方法 (isNetworkAvailable())?在启动线程之前调用它...如果返回 true,则运行线程,如果为 null,则不运行。在这种情况下,你就不需要我提到的意图广播了。private boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null; } - wired00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接