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