java - 当没有 Internet 连接时在 GridView 中返回 NullPointerException 时出现问题

标签 java android android-studio gridview

我正在尝试在没有互联网的情况下访问我的应用程序,并且我希望应用程序通知没有连接,而不是单独关闭并给出错误。 当我的互联网被禁用时,我无法访问该应用程序。它只是自行关闭并返回错误:

    D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.myapp.test, PID: 20245
    java.lang.NullPointerException
        at java.util.Objects.requireNonNull(Objects.java:203)
        at java.util.Arrays$ArrayList.<init>(Arrays.java:3741)
        at java.util.Arrays.asList(Arrays.java:3728)
        at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:164)
        at com.myapp.test.utils.adapters.CustomGridView.<init>(CustomGridView.java:35)
        at com.myapp.test.fragment.FragmentHome.onCreateView(FragmentHome.java:193)
        at android.support.v4.app.Fragment.performCreateView(Fragment.java:2346)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1428)
        at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
        at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
        at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2596)
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383)
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245)
        at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3248)
        at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3200)
        at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:195)
        at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:597)
        at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1392)
        at android.app.Activity.performStart(Activity.java:7260)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3009)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1840)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6872)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
E/MQSEventManagerDelegate: failed to get MQSService.

据我了解,我需要返回一个空值,但我无法在我的代码中实现它。有人可以帮助我吗?

这是我的 GridView 的代码:

    package com.myapp.test.utils.adapters;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.myapp.test.R;
import com.myapp.test.utils.image.RoundedSquareImageView;
import com.myapp.test.utils.text.DinTextView;

import java.io.InputStream;

/**
 * Created by jaiso on 13-02-2018.
 */

public class CustomGridView extends ArrayAdapter<String>{

    private String[] profilename;
    private String[] imagepath;
    private String[] ImgUserStatus;
    private Activity context;
    Bitmap bitmap;

    public CustomGridView(Activity context, String[] profilename, String[] imagepath, String[] ImgUserStatus) {
        super(context, R.layout.item_home_grid_users,profilename);
        this.context=context;
        this.profilename=profilename;
        this.imagepath=imagepath;
        this.ImgUserStatus=ImgUserStatus;

    }

    @NonNull
    @Override

    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent){
        View r=convertView;
        ViewHolder viewHolder=null;
        if(r==null){
            LayoutInflater layoutInflater=context.getLayoutInflater();
            r=layoutInflater.inflate(R.layout.item_home_grid_users,null,true);
            viewHolder=new ViewHolder(r);
            r.setTag(viewHolder);
        }
        else {
            viewHolder=(ViewHolder)r.getTag();

        }

        viewHolder.tvw1.setText(profilename[position]);
        new GetImageFromURL(viewHolder.ivw).execute(imagepath[position]);
        new GetImageFromURLStatus(viewHolder.ImgStatusOnlineOffline).execute(ImgUserStatus[position]);
        return r;
    }

    class ViewHolder{

        DinTextView tvw1;
        RoundedSquareImageView ivw;
        ImageView ImgStatusOnlineOffline;
        LinearLayout LinearFavIconHidden;

        ViewHolder(View v){
            tvw1=(DinTextView)v.findViewById(R.id.fragm_feed_txt_name);
            ivw=(RoundedSquareImageView)v.findViewById(R.id.fragm_feed_profile_image);
            ImgStatusOnlineOffline=(ImageView)v.findViewById(R.id.fragm_home_user_img_status_online_offline);
        }

    }

    public class GetImageFromURL extends AsyncTask<String,Void,Bitmap>
    {
        RoundedSquareImageView imgView;
        public GetImageFromURL(RoundedSquareImageView imgv)
        {
            this.imgView=imgv;
        }
        @Override
        protected Bitmap doInBackground(String... url) {
            String urldisplay=url[0];
            bitmap=null;

            try{

                InputStream ist=new java.net.URL(urldisplay).openStream();
                bitmap= BitmapFactory.decodeStream(ist);
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }

            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap){

            super.onPostExecute(bitmap);
            imgView.setImageBitmap(bitmap);
        }
    }

    public class GetImageFromURLStatus extends AsyncTask<String,Void,Bitmap>
    {
        ImageView imgViewStatus;
        public GetImageFromURLStatus(ImageView imgvStatus)
        {
            this.imgViewStatus=imgvStatus;
        }
        @Override
        protected Bitmap doInBackground(String... url) {
            String urldisplay=url[0];
            bitmap=null;

            try{

                InputStream ist=new java.net.URL(urldisplay).openStream();
                bitmap= BitmapFactory.decodeStream(ist);
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }

            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap){

            super.onPostExecute(bitmap);
            imgViewStatus.setImageBitmap(bitmap);
        }
    }
}

最佳答案

现在,只要设备连接到互联网,您的应用程序就可以运行,但当互联网不可用时,您的应用程序就会崩溃。

因此,您需要检查是否已连接到互联网,如果没有,则需要阻止任何尝试解析任何 URL 的代码。

为了检查您的设备是否已连接到互联网,请使用以下方法,如果您的设备已连接到互联网,则返回 true

public boolean isOnline(Context context) {

    boolean isConnected = false;
    ConnectivityManager   mConnectivityMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
        // Checking internet connectivity
        NetworkInfo activeNetwork = null;
        if (mConnectivityMgr != null) {
            activeNetwork = mConnectivityMgr.getActiveNetworkInfo(); // Deprecated in API 29
        }
        isConnected = activeNetwork != null;

    } else {
        Network[] allNetworks = mConnectivityMgr.getAllNetworks(); // added in API 21 (Lollipop)

        for (Network network : allNetworks) {
            NetworkCapabilities networkCapabilities = mConnectivityMgr.getNetworkCapabilities(network);
            if (networkCapabilities != null) {
                if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                        || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                        || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET))
                    isConnected = true;
            }
        }
    }

    return isConnected;

}

在名为 CustomGridView 的自定义适配器类中添加 isOnline() 方法。

在您的代码中,您尝试在适配器中访问互联网,特别是在使用自定义 AsyncTask 类的 getView() 方法中。所以改变这个方法来检查你是否在线。

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View r = convertView;
        ViewHolder viewHolder = null;
        if (r == null) {
            LayoutInflater layoutInflater = context.getLayoutInflater();
            r = layoutInflater.inflate(R.layout.item_home_grid_users, null, true);
            viewHolder = new ViewHolder(r);
            r.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) r.getTag();

        }

        viewHolder.tvw1.setText(profilename[position]);

        if (isOnline(parent.getContext())) {
            new GetImageFromURL(viewHolder.ivw).execute(imagepath[position]);
            new GetImageFromURLStatus(viewHolder.ImgStatusOnlineOffline).execute(ImgUserStatus[position]);
        }

        return r;
    }

检查this answer如果您想了解有关互联网功能的更多信息。

关于java - 当没有 Internet 连接时在 GridView 中返回 NullPointerException 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61329411/

相关文章:

java - 如何将数据从一个 Activity 传递到下一个 Activity

java - eclipse rap下载服务servlet报错

java - java中接受用逗号分隔的多个电子邮件地址的正则表达式

android - 获取可以启动的已安装应用程序列表

android - React Native - 打包程序在演示应用程序 (Android) 上挂起转换 (100% 393/394)

java - 如何在 android Studio 中更改 Kotlin android 项目的名称

android - 在升级之前甚至在最新的Gradle升级之后,Gradle同步失败

java - proguard 解析 android.txt 文件中的异常

java - 使用 getter 方法检索到的 boolean 值填充 TextView

android - 如何以编程方式禁用 #Android 指纹身份验证的最大失败尝试次数?