如何解决 Unchecked cast in android 而不抑制警告
How to solve Unchecked cast in android without suppressing the warning
如何在不使用 SuppressWarning("uncheckedcast") 的情况下解决此问题,这有任何方法可以在投射之前检查对象或任何其他方法来解决此问题。
问题出在 onLoadFinished() 内部。如您所见,我将数据用于不同的数据类型,首先是布尔值,然后是列表。
提前谢谢你。
package com.howaboutthis.satyaraj.wallpaper;
import android.support.v4.app.Fragment;
import android.support.v4.content.Loader;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v4.app.LoaderManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class FragmentChanging extends Fragment implements LoaderManager.LoaderCallbacks {
private ProgressDialog dialog;
public FragmentChanging(){
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup
container,
Bundle savedInstanceState) {
final View view =
inflater.inflate(R.layout.fragment_changing_wallpaper, container, false);
getLoaderMangaer.init(0,null,FragmentChanging.this);
return view;
}
@Override
public Loader onCreateLoader(int id, Bundle args) {
if (id == 0 || id == 2){
dialog.setMessage("Loading Settings...");
dialog.show();
}
return new TestInternetLoader(getContext());
}
return null;
}
@Override
public void onLoadFinished(Loader loader, Object data) {
int id = loader.getId();
if (id == 0 || id == 2){
boolean check = (Boolean) data;
if (check)
if (dialog.isShowing()) dialog.dismiss();
}
else if(id == 3)
List<Bitmap> bitmaps = (List<Bitmap>) data; //Unchecked cast
}
@Override
public void onLoaderReset(Loader loader) {
}
}
您可以使用 LoaderManager.LoaderCallbacks<List<Bitmap>>
来消除 lint 警告。如果你想这样做,你将不得不(几乎)将 Loader
的每次出现更改为 Loader<List<Bitmap>>
。
(例外好像是onLoaderReset(Loader loader)
)
此外,如果您使用自定义 AsyncTaskLoader
,则必须扩展 AsyncTaskLoader<List<Bitmap>>
。
那你可以写
@Override
public void onLoadFinished(Loader<List<Bitmap>> loader, List<Bitmap> data) {
List<Bitmap> bitmaps = data;
}
编辑
如果由于数据类型可能不同而无法使用建议的方法,您可以检查要处理的类型,如下所示:
if (data instanceof List<?>){
List temp = (List)data;
// do what's required for List data
// (if necessary do a type check on list elements)
if (tempList.size() > 0){
Object firstItem = tempList.get(0);
if (firstItem instanceof Bitmap){
// now you know that your Loader gave you a List with at least one Bitmap
List<Bitmap> bitmaps = new ArrayList<>();
for (Object item: tempList){
if (item instanceof Bitmap){
bitmaps.add((Bitmap) item);
}
}
}
}
}
else if (data instanceof Boolean){
boolean check = (Boolean) data;
if (check){
// handle Boolean data
}
}
如何在不使用 SuppressWarning("uncheckedcast") 的情况下解决此问题,这有任何方法可以在投射之前检查对象或任何其他方法来解决此问题。 问题出在 onLoadFinished() 内部。如您所见,我将数据用于不同的数据类型,首先是布尔值,然后是列表。 提前谢谢你。
package com.howaboutthis.satyaraj.wallpaper;
import android.support.v4.app.Fragment;
import android.support.v4.content.Loader;
import android.content.Context;
import android.content.DialogInterface;
import android.support.v4.app.LoaderManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class FragmentChanging extends Fragment implements LoaderManager.LoaderCallbacks {
private ProgressDialog dialog;
public FragmentChanging(){
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup
container,
Bundle savedInstanceState) {
final View view =
inflater.inflate(R.layout.fragment_changing_wallpaper, container, false);
getLoaderMangaer.init(0,null,FragmentChanging.this);
return view;
}
@Override
public Loader onCreateLoader(int id, Bundle args) {
if (id == 0 || id == 2){
dialog.setMessage("Loading Settings...");
dialog.show();
}
return new TestInternetLoader(getContext());
}
return null;
}
@Override
public void onLoadFinished(Loader loader, Object data) {
int id = loader.getId();
if (id == 0 || id == 2){
boolean check = (Boolean) data;
if (check)
if (dialog.isShowing()) dialog.dismiss();
}
else if(id == 3)
List<Bitmap> bitmaps = (List<Bitmap>) data; //Unchecked cast
}
@Override
public void onLoaderReset(Loader loader) {
}
}
您可以使用 LoaderManager.LoaderCallbacks<List<Bitmap>>
来消除 lint 警告。如果你想这样做,你将不得不(几乎)将 Loader
的每次出现更改为 Loader<List<Bitmap>>
。
(例外好像是onLoaderReset(Loader loader)
)
此外,如果您使用自定义 AsyncTaskLoader
,则必须扩展 AsyncTaskLoader<List<Bitmap>>
。
那你可以写
@Override
public void onLoadFinished(Loader<List<Bitmap>> loader, List<Bitmap> data) {
List<Bitmap> bitmaps = data;
}
编辑
如果由于数据类型可能不同而无法使用建议的方法,您可以检查要处理的类型,如下所示:
if (data instanceof List<?>){
List temp = (List)data;
// do what's required for List data
// (if necessary do a type check on list elements)
if (tempList.size() > 0){
Object firstItem = tempList.get(0);
if (firstItem instanceof Bitmap){
// now you know that your Loader gave you a List with at least one Bitmap
List<Bitmap> bitmaps = new ArrayList<>();
for (Object item: tempList){
if (item instanceof Bitmap){
bitmaps.add((Bitmap) item);
}
}
}
}
}
else if (data instanceof Boolean){
boolean check = (Boolean) data;
if (check){
// handle Boolean data
}
}