当前位置: 首页 > 知识库问答 >
问题:

跳过47帧,应用程序可能在其主线程上做了太多工作

邵博艺
2023-03-14

这发生在我将微调值保存到文件时。我已经使用线程来重新使用它的工作。但它仍然不工作...请帮助我...

public void select(View view)
    {
        final Spinner s = (Spinner) findViewById(R.id.spinner1);
        final String FILENAME = "Username";
        new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

            s.setOnItemSelectedListener(new OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
                    try {
                        FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_APPEND);
                        user = s.getSelectedItem().toString();

                        fos.write(user.getBytes());

                        fos.close();
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                @Override
                public void onNothingSelected(AdapterView<?> parentView) {
                    // your code here
                }

            });

        }   
    });


}

共有2个答案

华谭三
2023-03-14

这是当您在主线程上执行一些繁重的进程(内存访问)时系统显示的消息,为了避免此消息,您需要使用AsyncTask。

参考:http://developer.android.com/reference/android/os/AsyncTask.html

Docs for AsyncTask附带了一个解释良好的示例,说明了您可以/应该如何有效地使用它,以从中获得最大的好处。

请记住,如果您使用模拟器,获得这些系统正在跳过帧的消息并不是什么大问题。这其实很常见。请记住,应用程序在使用模拟器时跳过的帧不应超过100帧。

皇甫智明
2023-03-14

忘记创建单独的线程,让AsyncTask为您完成。

   s.setOnItemSelectedListener(new OnItemSelectedListener() {
     @Override
     public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
       new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground( final Void ... params ) {
            try {
                    FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_APPEND);
                    user = s.getSelectedItem().toString();

                    fos.write(user.getBytes());

                    fos.close();
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            return null;
        }

        @Override
        protected void onPostExecute( final Void result ) {

        }
    }.execute();
  }

  @Override
  public void onNothingSelected(AdapterView<?> parentView) {
       // your code here
  }

});
 类似资料:
  • 这很好,但我在日志中收到“应用程序可能做了太多工作”消息,并跳过了一系列帧。我该如何解决这个问题?

  • 我正在用这个功能为Android应用程序编码: 我成功地运行了它,但在我为Android支持设计导入了一些Nuget软件包之后,现在它抛出了这样一条消息。 我/编舞(1962):跳过了524帧!应用程序可能在其主线程上做了太多工作。 你能告诉我我做错了什么吗?

  • 我正在开发一个应用程序,它应该从网络服务中获取JSON响应,并将每个元素写入列表视图,我读到我应该使用Asyncask来获取HTTP响应,我做到了,我可以从网络服务中检索数据并在TextViews中显示它们。但是当我尝试在列表视图中显示元素时,它不会显示任何内容,并在logcat中给我以下消息: 这是我的主要代码: 我的列表适配器: 最后是搜索结果。java: 那么,我做错了什么?你对此有什么想法

  • 我查看了StackOverflow的答案,但没找到多少。所以,我这样做是为了练习,就像Hello World使用JSON一样,我从openweather API获得JSON响应。我在EditText中写下城市的名称,然后按下按钮进行搜索,并在日志中显示JSON字符串。 我该怎么做才能不收到那个消息?

  • 我在下面的代码中ping了java Android中的IP列表,但我现在的问题是运行时出现延迟,这个问题显示为“跳过602帧!应用程序可能在其主线程上做了太多工作。”有人能给我推荐一个解决方案吗?因为我是android的初学者

  • 在我的viewpager实现中,我正在膨胀视图(而不是片段)。我的主课是拓展活动。当我尝试从我的应用程序或应用程序中滑动屏幕时,我会遇到此错误 和 CustomPagerAdapter: 我的活动: 是实验室布局吗: