为什么 LogCat 显示 IllegalStateException?
Why is the LogCat showing IllegalStateException?
我发现了一个奇怪的崩溃错误。我定义了一个警报对话框,我使用 getListView().getContext() 获得了它的上下文。但是 logcat 显示 IllegalStateException。这可能是因为当我在执行 findInBackGround() 方法之前关闭 activity 时,它将没有上下文,因为 activity 被终止并且方法 findInBackGround() 在后台执行并且仍然会在背景。
java 代码片段是
public class InboxFragment extends ListFragment {
protected List<ParseObject> myMessages;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_inbox, container,
false);
return rootView;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
String fileType = myMessages.get(position).getString(
ParseConstants.KEY_FILETYPE);
ParseFile file = myMessages.get(position).getParseFile(
ParseConstants.KEY_FILE);
Uri uri = Uri.parse(file.getUrl());
if (fileType.equals(R.string.filetype_image)) {
Intent i = new Intent(getActivity(), ViewImageActivity.class);
i.setData(uri);
startActivity(i);
} else {
Intent i = new Intent();
i.setData(uri);
i.setType("video/*");
startActivity(i);
}
List<String> count = myMessages.get(position).getList(
ParseConstants.KEY_RECEPIENTSIDS);
if (count.size() == 1) {
myMessages.get(position).deleteInBackground();
} else {
myMessages.get(position).getList(ParseConstants.KEY_RECEPIENTSIDS)
.remove(ParseUser.getCurrentUser().getObjectId());
myMessages.get(position).saveInBackground();
}
}
private boolean isNetworkAvailableAndConnected() {
ConnectivityManager manager = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info != null && info.isConnected())
return true;
else
return false;
}
@Override
public void onResume() {
super.onResume();
if (isNetworkAvailableAndConnected()) {
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
ParseConstants.KEY_MESSAGES);
query.whereEqualTo(ParseConstants.KEY_RECEPIENTSIDS, ParseUser
.getCurrentUser().getObjectId());
query.orderByDescending("createdAt");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> messages, ParseException e) {
if (e == null) {
// found messages successfully
myMessages = messages;
String[] usernames = new String[myMessages.size()];
for (int i = 0; i < messages.size(); i++) {
usernames[i] = messages.get(i).getString(
ParseConstants.KEY_SENDERNAME);
}
if (getListView().getAdapter() == null) {
MessageAdapter adapter = new MessageAdapter(
getListView().getContext(), myMessages);
setListAdapter(adapter);
} else {
// refill
((MessageAdapter) getListView().getAdapter())
.refill(myMessages);
}
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(
getListView().getContext());
builder.setMessage(R.string.messages_loading_failed);
builder.setTitle(getString(R.string.dialog_title));
builder.setPositiveButton(android.R.string.ok, null);
AlertDialog dialog = builder.create();
dialog.show();
}
}
});
} else {
Toast.makeText(getActivity(), "No internet connection",
Toast.LENGTH_LONG).show();
}
}
}
logcat 是
02-08 00:06:22.444: E/AndroidRuntime(26541): FATAL EXCEPTION: main
02-08 00:06:22.444:E/AndroidRuntime(26541):java.lang.IllegalStateException:内容视图尚未创建
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.app.ListFragment.ensureList(ListFragment.java:386)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.app.ListFragment.getListView(ListFragment.java:280)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.example.friendsapp.InboxFragment$1.done(InboxFragment.java:116)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.parse.FindCallback.internalDone(FindCallback.java:45)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.parse.FindCallback.internalDone(FindCallback.java:31)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.parse.Parse$4$1.run(Parse.java:792)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.os.Handler.handleCallback(Handler.java:800)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.os.Handler.dispatchMessage(Handler.java:100)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.os.Looper.loop(Looper.java:194)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.app.ActivityThread.main(ActivityThread.java:5371)
02-08 00:06:22.444:E/AndroidRuntime(26541):在 java.lang.reflect.Method.invokeNative(本机方法)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 java.lang.reflect.Method.invoke(Method.java:525)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
02-08 00:06:22.444:E/AndroidRuntime(26541):在 dalvik.system.NativeStart.main(本机方法)
有没有办法在不导致崩溃的情况下完成 findInBackgound 完成的工作。或者是由于任何其他逻辑错误导致的崩溃。
请确保您是从 DDMS window 中选择设备,并且您已选择所有消息或您希望在“保存的过滤器”部分中显示的内容的派生词。如果您不想过滤掉内容,也不要在上面的搜索字段中键入任何内容。拔下并重新插入设备往往也能解决问题。
如果这是第一次,那么您需要通过在设置中打开 USB 调试来允许与您的设备通信。这是通过首先打开您可以研究的开发人员选项来完成的。
我从博客中找到了答案。我需要使用
if(getActivity() != null )
在显示对话框之前。感谢大家。
我发现了一个奇怪的崩溃错误。我定义了一个警报对话框,我使用 getListView().getContext() 获得了它的上下文。但是 logcat 显示 IllegalStateException。这可能是因为当我在执行 findInBackGround() 方法之前关闭 activity 时,它将没有上下文,因为 activity 被终止并且方法 findInBackGround() 在后台执行并且仍然会在背景。 java 代码片段是
public class InboxFragment extends ListFragment {
protected List<ParseObject> myMessages;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_inbox, container,
false);
return rootView;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
String fileType = myMessages.get(position).getString(
ParseConstants.KEY_FILETYPE);
ParseFile file = myMessages.get(position).getParseFile(
ParseConstants.KEY_FILE);
Uri uri = Uri.parse(file.getUrl());
if (fileType.equals(R.string.filetype_image)) {
Intent i = new Intent(getActivity(), ViewImageActivity.class);
i.setData(uri);
startActivity(i);
} else {
Intent i = new Intent();
i.setData(uri);
i.setType("video/*");
startActivity(i);
}
List<String> count = myMessages.get(position).getList(
ParseConstants.KEY_RECEPIENTSIDS);
if (count.size() == 1) {
myMessages.get(position).deleteInBackground();
} else {
myMessages.get(position).getList(ParseConstants.KEY_RECEPIENTSIDS)
.remove(ParseUser.getCurrentUser().getObjectId());
myMessages.get(position).saveInBackground();
}
}
private boolean isNetworkAvailableAndConnected() {
ConnectivityManager manager = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info != null && info.isConnected())
return true;
else
return false;
}
@Override
public void onResume() {
super.onResume();
if (isNetworkAvailableAndConnected()) {
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
ParseConstants.KEY_MESSAGES);
query.whereEqualTo(ParseConstants.KEY_RECEPIENTSIDS, ParseUser
.getCurrentUser().getObjectId());
query.orderByDescending("createdAt");
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> messages, ParseException e) {
if (e == null) {
// found messages successfully
myMessages = messages;
String[] usernames = new String[myMessages.size()];
for (int i = 0; i < messages.size(); i++) {
usernames[i] = messages.get(i).getString(
ParseConstants.KEY_SENDERNAME);
}
if (getListView().getAdapter() == null) {
MessageAdapter adapter = new MessageAdapter(
getListView().getContext(), myMessages);
setListAdapter(adapter);
} else {
// refill
((MessageAdapter) getListView().getAdapter())
.refill(myMessages);
}
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(
getListView().getContext());
builder.setMessage(R.string.messages_loading_failed);
builder.setTitle(getString(R.string.dialog_title));
builder.setPositiveButton(android.R.string.ok, null);
AlertDialog dialog = builder.create();
dialog.show();
}
}
});
} else {
Toast.makeText(getActivity(), "No internet connection",
Toast.LENGTH_LONG).show();
}
}
} logcat 是
02-08 00:06:22.444: E/AndroidRuntime(26541): FATAL EXCEPTION: main
02-08 00:06:22.444:E/AndroidRuntime(26541):java.lang.IllegalStateException:内容视图尚未创建 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.app.ListFragment.ensureList(ListFragment.java:386) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.app.ListFragment.getListView(ListFragment.java:280) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.example.friendsapp.InboxFragment$1.done(InboxFragment.java:116) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.parse.FindCallback.internalDone(FindCallback.java:45) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.parse.FindCallback.internalDone(FindCallback.java:31) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.parse.Parse$4$1.run(Parse.java:792) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.os.Handler.handleCallback(Handler.java:800) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.os.Handler.dispatchMessage(Handler.java:100) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.os.Looper.loop(Looper.java:194) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 android.app.ActivityThread.main(ActivityThread.java:5371) 02-08 00:06:22.444:E/AndroidRuntime(26541):在 java.lang.reflect.Method.invokeNative(本机方法) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 java.lang.reflect.Method.invoke(Method.java:525) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 02-08 00:06:22.444: E/AndroidRuntime(26541): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 02-08 00:06:22.444:E/AndroidRuntime(26541):在 dalvik.system.NativeStart.main(本机方法)
有没有办法在不导致崩溃的情况下完成 findInBackgound 完成的工作。或者是由于任何其他逻辑错误导致的崩溃。
请确保您是从 DDMS window 中选择设备,并且您已选择所有消息或您希望在“保存的过滤器”部分中显示的内容的派生词。如果您不想过滤掉内容,也不要在上面的搜索字段中键入任何内容。拔下并重新插入设备往往也能解决问题。
如果这是第一次,那么您需要通过在设置中打开 USB 调试来允许与您的设备通信。这是通过首先打开您可以研究的开发人员选项来完成的。
我从博客中找到了答案。我需要使用
if(getActivity() != null )
在显示对话框之前。感谢大家。