【问题标题】:Why is the LogCat showing IllegalStateException?为什么 LogCat 显示 IllegalStateException?
【发布时间】:2015-03-19 04:48:21
【问题描述】:

我发现了一个奇怪的崩溃错误。我定义了一个警报对话框,我使用 getListView().getContext() 获得了它的上下文。但是 logcat 显示 IllegalStateException。这可能是因为当我在 findInBackGround() 方法执行之前关闭活动时,它将没有上下文,因为活动已终止并且方法 findInBackGround() 在后台执行并且仍将在后台执行。 java代码sn -p是

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): at 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): at 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(Native Method) 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): at dalvik.system.NativeStart.main(Native Method)

有没有办法在不导致崩溃的情况下完成 findInBackgound 完成的工作。或者是由于任何其他逻辑错误导致的崩溃。

【问题讨论】:

    标签: android eclipse logging


    【解决方案1】:

    确保您从 DDMS 窗口中选择了设备,并且您选择了所有消息或您希望在“已保存的过滤器”部分中显示的内容的派生项。如果您不想过滤掉任何内容,也不要在上面的搜索字段中输入任何内容。拔下并重新插入设备往往也能在某些情况下修复问题。

    如果这是第一次,那么您需要通过在设置中打开 USB 调试来允许与您的设备通信。这是通过首先打开您可以研究的开发者选项来完成的。

    【讨论】:

      【解决方案2】:

      我从博客中找到了答案。我需要使用

      if(getActivity() != null ) 
      

      在显示对话框之前。谢谢大家。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-12
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多