0

我想在我的应用程序中存档网络更改侦听器。例如:当我在没有移动数据和无线网络的情况下启动我的应用程序时,它显示“网络不可用!”。之后,当我开启Wifi或移动数据时,它会自动获取数据并在UI上显示。为什么网络更改监听器不适用于我的应用?

我也有扩展Fragment的Main活动实现接口以及基础片段。 我试过broadcastreceiver,但它不起作用。当我运行没有网络的应用程序时,它显示两次没有互联网连接。在Wifi ON不自动更新后,当我点击菜单中的其他选项后,UI会显示。请帮我...

1-主要活动

public class MainActivity extends AppCompatActivity implements BaseFragment.OnFragmentInteractionListener{ 

    private Realm realm; 
    private Results results; 
    RecycleAdapter recyclerAdapter; 
    BroadcastReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     RealmConfiguration realmConfiguration = new RealmConfiguration.Builder 
       (MainActivity.this) 
       .build(); 
     Realm.setDefaultConfiguration(realmConfiguration); 
    } 


    @Override 
    public void onTabletListener(Results result) { 
     DetailFragment detailFragment = (DetailFragment) getFragmentManager() 
       .findFragmentById(R.id.fragment_detail); 

     if (detailFragment != null) { 
      detailFragment.updateTabletUI(result); 
     } 
    } 

    @Override 
    public void onFragmentInteraction(Results currentMovie) { 
     DetailFragment detailFragment = (DetailFragment) getFragmentManager() 
       .findFragmentById(R.id.fragment_detail); 

     if (detailFragment == null) { 
      Intent intent = new Intent(this, DetailActivity.class) 
        .putExtra("movie_Id", currentMovie.getId()) 
        .putExtra("movie_Name", currentMovie.getTitle()) 
        .putExtra("poster_Path", currentMovie.getPoster_path()) 
        .putExtra("back_poster_Path", currentMovie.getBackdrop_path()) 
        .putExtra("release_Date", currentMovie.getRelease_date()) 
        .putExtra("users_Rating", currentMovie.getVote_average()) 
        .putExtra("overview", currentMovie.getOverview()); 
      startActivity(intent); 
     } else { 
      detailFragment.updateTabletUI(currentMovie); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.favoriteList) { 
      Intent intent=new Intent(MainActivity.this, FavoriteActivity.class); 
      startActivity(intent); 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

2-碱基的片段类

public class BaseFragment extends android.app.Fragment implements RecycleAdapter.GetDataFromAdapter { 

    @Bind(R.id.recyclerView) 
    RecyclerView recyclerView; 
    private static final String STATE_MOVIES = "state_movies"; 
    private View rootView, noView; 
    private DataManager dataManager; 
    private RecycleAdapter recyclerAdapter; 
    private MovieResponse movieResponse; 
    private List<Results> resultsList; 

    private Results results; 
    private OnFragmentInteractionListener mListener; 
    private int menuItemPosition; 
    private BroadcastReceiver receiver; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putParcelableArrayList(STATE_MOVIES, (ArrayList<? extends Parcelable>) resultsList); 
     outState.putInt("menu_item", menuItemPosition); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()){ 
      case R.id.most_Popular: 
       if(item.isChecked()){ 
       }else{ 
        item.setChecked(true); 
        menuItemPosition = item.getItemId(); 
        makeService("POPULAR"); 
        return true; 
       } 
      case R.id.high_rated: 
       if(item.isChecked()){ 
       }else{ 
        item.setChecked(true); 
        menuItemPosition = item.getItemId(); 
        makeService("TOP"); 
        return true; 
       } 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 
     // this will get called when the activity is re-created on device configuration change 
     menu.findItem(menuItemPosition).setChecked(true); 
    } 



    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     rootView = inflater.inflate(R.layout.fragment_base, container, false);    

     ButterKnife.bind(this, rootView); 
     resultsList=new ArrayList<Results>(); 
     configRecycleView(); 

     if (savedInstanceState==null){ 
      receiver=new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context context, Intent intent) { 
       int status= NetworkStatus.getConnectivityStatus(context); 
       if (status==0){ 
       }else{ 
        makeService("POPULAR"); 
       } 
       } 
      }; 
      menuItemPosition = R.id.most_Popular; 
     }else{ 
      resultsList=savedInstanceState.getParcelableArrayList(STATE_MOVIES); 
      menuItemPosition = savedInstanceState.getInt("menu_item"); 
      recyclerAdapter.addMovieList(resultsList); 
     } 
     return rootView; 
    } 

    private void configRecycleView() { 
     AutofitGridlayout layoutManager = new AutofitGridlayout(getActivity(), 200); 
     recyclerView.setHasFixedSize(true); 
     recyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool()); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerAdapter = new RecycleAdapter(getActivity(), BaseFragment.this); 
     recyclerView.setAdapter(recyclerAdapter); 
    } 

    private void makeService(String query){ 
     dataManager = new DataManager(); 
     Call<MovieResponse> listCall; 
     if (query=="TOP") { 
      listCall= dataManager.getJSONData().getTopMovies(); 
     }else{ 
      listCall= dataManager.getJSONData().getPopMovies(); 
     } 
     listCall.enqueue(new Callback<MovieResponse>() { 
      @Override 
      public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) { 
       if (response.isSuccessful()) { 
        Results[] results = response.body().getResults(); 
        resultsList = new ArrayList<Results>(Arrays.asList(results)); 
        recyclerAdapter.addMovieList(resultsList); 
        Results firstResult=resultsList.get(0); 
        mListener.onTabletListener(firstResult); 
       } 
      } 

      @Override 
      public void onFailure(Call<MovieResponse> call, Throwable t) { 
       Snackbar.make(rootView, R.string.Network_error, Snackbar.LENGTH_LONG) 
         .show(); 
      } 
     }); 
    } 

    @Override 
    public void onCurrentMovie(Results currentMovie) { 
     mListener.onFragmentInteraction(currentMovie); 
    } 

    @Override 
    public void onAttach(Activity context) { 
     super.onAttach(context); 

     if (context instanceof OnFragmentInteractionListener) { 
      mListener = (OnFragmentInteractionListener) context; 
     } else { 
      throw new RuntimeException(context.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    public interface OnFragmentInteractionListener { 
     void onTabletListener(Results result); 
     void onFragmentInteraction(Results result); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
    } 
} 

3- NetworkStatus类

public class NetworkStatus { 

     public static int TYPE_WIFI = 1; 
     public static int TYPE_MOBILE = 2; 
     public static int TYPE_NOT_CONNECTED = 0; 

     public static int getConnectivityStatus(Context context) { 
      ConnectivityManager cm = (ConnectivityManager) context 
        .getSystemService(Context.CONNECTIVITY_SERVICE); 

      NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
      if (null != activeNetwork) { 
       if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) 
        return TYPE_WIFI; 

       if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) 
        return TYPE_MOBILE; 
      } 
      return TYPE_NOT_CONNECTED; 
     } 
} 

4-清单---

<manifest package="com.santossingh.popularmovieapp" 
      xmlns:android="http://schemas.android.com/apk/res/android"> 

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <activity 
      android:name=".Activities.MainActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".Activities.FavoriteActivity" 
      android:label="@string/title_activity_favorite" 
      android:parentActivityName=".Activities.MainActivity" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value=".Activities.MainActivity"/> 
     </activity> 
     <activity 
      android:name=".Activities.VideoActivity" 
      android:label="@string/title_activity_video" 
      android:theme="@style/AppTheme.NoActionBar"> 
     </activity> 
     <activity 
      android:name=".Activities.DetailActivity" 
      android:label="@string/title_activity_detail" 
      android:parentActivityName=".Activities.MainActivity" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.santossingh.popularmovieapp.Activities.MainActivity"/> 
     </activity> 
     <activity 
      android:name=".Activities.ReviewActivity" 
      android:label="@string/title_activity_review" 
      android:theme="@style/AppTheme.NoActionBar"> 

     </activity> 
    </application> 

</manifest> 

回答

1

首先,您似乎没有在清单文件中为网络设置接收器,因此在清单文件完成所有活动标记后,在应用程序标记内写下代码以注册您的接收器。

 <receiver android:name=".Activities.NetworkChangeReceiver" > 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
    </receiver> 

</application> 

请注意,如果你没有接收器,然后检查以下并使用它。

 import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.widget.Toast; 

    public class NetworkChangeReceiver extends BroadcastReceiver { 

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

     String status = NetworkUtil.getConnectivityStatusString(context); 
     Toast.makeText(context, status, Toast.LENGTH_LONG).show(); 
     } 
    } 
+0

但是如何以及在哪里调用BaseFragment类中的NetworkChangeReceiver类? – Santosh

+0

您不需要像现在从Manifest文件注册那样调用它,所以它会在应用程序启动并开始通知Internet连接后立即初始化。 – Vickyexpert