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

时间:2014-12-12 10:03:46

标签: android spinner android-spinner

将微调器值保存到文件时会发生这种情况。我用线程来减少它的工作。但它仍然不起作用..请帮助我...

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 个答案:

答案 0 :(得分:1)

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

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

AsyncTask的文档附带了一个很好的解释示例,说明如何有效地使用它来从中获益最多。

请记住,如果您使用模拟器,那么系统正在跳帧的这些消息就不是问题了。它实际上很常见。请记住,在使用模拟器时,应用程序不应跳过超过100帧。

答案 1 :(得分:1)

忘记创建单独的线程,让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
  }

});