полный код для проверки интернет-соединения по asynctask - PullRequest
0 голосов
/ 28 октября 2018

Я получаю сообщение об ошибке: -

" java.lang.RuntimeException: Невозможно создать экземпляр активности ComponentInfo {com.example.juhi_gupta.pizza_corner / com.example.juhi_gupta.pizza_corner.SplashScreen}:java.lang.InstantiationException: java.lang.Class не имеет конструктора с нулевым аргументом"

Что не так в моем коде?Я новичок в Asynctask.

public class SplashScreen extends Activity {

Context context;

SplashScreen(Context context)
{
    this.context = context;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    int SPLASH_TIME_OUT = 3000;
    new Handler().postDelayed(new Runnable() {

        /*
         * Showing splash screen with a timer. This will be useful when you
         * want to show case your app logo / company
         */

        @Override
        public void run() {
            // This method will be executed once the timer is over
            // Start your app main activity
            Intent i = new Intent(SplashScreen.this, LoginActivity.class);
            startActivity(i);
            overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

            // close this activity
            finish();
        }
    }, SPLASH_TIME_OUT);

    if (isNetworkAvailable()) {
        new CheckInternetAsyncTask(getApplicationContext()).execute();
    }
    else {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("No Internet Connection");
        alertDialogBuilder.setPositiveButton("yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                Toast.makeText(getApplicationContext(), "Please check your internet connection and try again", Toast.LENGTH_SHORT).show();
            }
        });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
}

public boolean isNetworkAvailable() {
    ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isConnected();
}

@SuppressLint("StaticFieldLeak")
class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> {

    private Context context;

    CheckInternetAsyncTask(Context context) {
        this.context = context;
    }

    @Override
    protected Boolean doInBackground(Void... params) {

        ConnectivityManager cm =
                (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

        assert cm != null;
        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        boolean isConnected = activeNetwork != null &&
                activeNetwork.isConnected();

        if (isConnected) {
            try {
                HttpURLConnection urlc = (HttpURLConnection)
                        (new URL("http://clients3.google.com/generate_204")
                                .openConnection());
                urlc.setRequestProperty("User-Agent", "Android");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1500);
                urlc.connect();
                if (urlc.getResponseCode() == 204 &&
                        urlc.getContentLength() == 0)
                    return true;

            } catch (IOException e) {
                Log.e("TAG", "Error checking internet connection", e);
                Toast.makeText(getApplicationContext(), "Error checking internet connection", Toast.LENGTH_LONG).show();
                return false;
            }
        } else {
            Log.d("TAG", "No network available!");
            Toast.makeText(getApplicationContext(), "No network available!", Toast.LENGTH_LONG).show();
            return false;
        }
        return null;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        Log.d("TAG", "result" + result);

    }
  }
}

И мой файл Manifest.xml: -

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.juhi_gupta.pizza_corner">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >

        <!-- Splash screen -->
        <activity
            android:name="com.example.juhi_gupta.pizza_corner.SplashScreen"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Black.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

1 Ответ

0 голосов
/ 28 октября 2018

Решение: Есть 2 исправления:

1. Удалите это:

SplashScreen(Context context)
{
    this.context = context;
}

Напишите вместо этого внутри вашего onCreate() сразу после строки setContentView(...):

this.context = SplashScreen.this;

2. Вместо этого:

new CheckInternetAsyncTask(getApplicationContext()).execute();

Напишите это:

new CheckInternetAsyncTask(this.context).execute();

Затем:

Удалите этот код, указанный ниже, из вашего onCreate(..) и попробуйте отключить Wi-Fi и запустить приложение. Он покажет.

int SPLASH_TIME_OUT = 3000;
new Handler().postDelayed(new Runnable() {

    /*
     * Showing splash screen with a timer. This will be useful when you
     * want to show case your app logo / company
     */

    @Override
    public void run() {
        // This method will be executed once the timer is over
        // Start your app main activity
        Intent i = new Intent(SplashScreen.this, LoginActivity.class);
        startActivity(i);
        overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

        // close this activity
        finish();
    }
}, SPLASH_TIME_OUT);

Написать приведенный выше код внутри onPostExecute(...):

@Override
protected void onPostExecute(Boolean result) {
    super.onPostExecute(result);
    Log.d("TAG", "result" + result);

    ...... (Over Here)

}

Надеюсь, что это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...