0

アプリがインターネットに接続されているかどうかを確認しようとしています。タイムアウトを 3 秒に設定しています。インターネットチェックが「接続されていません」と返される場合があり (インターネットに接続していても)、そうでない場合もあります。他の人よりもチェックに時間がかかることがあるのはなぜですか? これがチェックされている間に、ダイアログボックスまたは何かをポップアップさせることはできますか?

public void isNetworkAvailable(final Handler handler)
{
    new Thread()
    {
        private boolean responded = false;

        @Override
        public void run()
        {
            new Thread()
            {
                @Override
                public void run()
                {
                    HttpGet requestForTest = new HttpGet("http://m.google.com");
                    try
                    {
                        new DefaultHttpClient().execute(requestForTest);
                        responded = true;
                    }
                    catch (Exception e)
                    {
                    }
                }
            }.start();

            try
            {
                int waited = 0;
                while (!responded && (waited < 3000))
                {
                    sleep(100);
                    if (!responded)
                    {
                        waited += 1000;
                    }
                }
            }
            catch (InterruptedException e)
            {
            } // do nothing
            finally
            {
                if (!responded)
                {
                    handler.sendEmptyMessage(0);
                }
                else
                {
                    handler.sendEmptyMessage(1);
                }
            }
        }
    }.start();
}

Handler h = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    { 
        if (msg.what != 1)
        { // code if not connected
            Log.i("Internet check", "Not connected");
        }
        else
        { // code if connected
            Log.i("Internet check", "Connected");
        }
    }
};
4

5 に答える 5

0

AsyncTask 内に配置することで、これを完了することができました。

class online extends AsyncTask<String, String, String> 
{
    boolean responded = false;
    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();
        pDialog2 = new ProgressDialog(Main.this);
        pDialog2.setMessage("Checking internet, please wait...");
        pDialog2.setIndeterminate(false);
        pDialog2.setCancelable(false);
        pDialog2.show();
    }

    protected String doInBackground(String... args) 
    {

        HttpGet requestForTest = new HttpGet("http://m.google.com");
        try
        {
            new DefaultHttpClient().execute(requestForTest); // can
            responded = true;
        }
        catch (Exception e)
        {
        }

        try
        {
            int waited = 0;
            while (!responded && (waited < 5000))
            {
                mHandler.postDelayed(new Runnable() 
                {
                    public void run() 
                    {
                    }
                }, 100);
                waited += 100;
            }
        }
        finally
        {
            if (!responded)
            {
                h.sendEmptyMessage(0);
            }
            else
            {
                h.sendEmptyMessage(1);
            }
        }
        return null;
    }

    protected void onPostExecute(String file_url) 
    {
        pDialog2.dismiss();
    }
}
于 2013-09-29T20:54:53.177 に答える
0
    public static Boolean isOnline(Context context) {
        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if(ni != null && ni.isConnected())
            return true;

        //Toast.makeText(context, context.getString(R.string.no_internet_connection), Toast.LENGTH_SHORT).show();
        return false;
     }

許可が必要です:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

編集:

あなたが正しく指摘しているように、これは確実な解決策ではありません。私の場合 (実際には言及しませんでした)、これは LocationClient.isConnected() と組み合わせた最初のチェックとして十分です。

あなたのコードを見ると、アプリの位置認識を使用する予定がない場合でも、LocationClient を見る価値があると思います。

これは、有効な接続があるかどうかを確認するためにリソースを繰り返し使用する必要がなくなるためです。LocationClient は、Google Play との既存の通信を使用して、接続されているかどうかを通知します。

もちろん、このソリューションは、ユーザーがデバイスに Google アカウントを追加していると仮定した場合にのみ機能します。

公式ガイドラインへのリンクは次のとおりです: http://developer.android.com/training/location/retrieve-current.html onConnected と onDisconnected の部分は、Define Location Services Callbacks セクションにあります。

于 2013-09-26T13:47:51.610 に答える
0

次のコードを使用します

if(!haveInternet()){

                    <Your Alert Dialog Here>

                }





private boolean haveInternet() {
            NetworkInfo info = ((ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE))
            .getActiveNetworkInfo();
            if (info == null || !info.isConnected()) {
                return false;
            }
            if (info.isRoaming()) {
                return true;
            }
            return true;
        }
于 2013-09-26T13:50:44.693 に答える