【问题标题】:Button onClick got 2 error message when I use Async当我使用异步时,按钮 onClick 收到 2 条错误消息
【发布时间】:2020-03-26 13:25:39
【问题描述】:

我的代码有什么问题?它显示错误:

1.无法解析方法 onCreate 'onCreate.android.os.Bundle'
2. 方法不会在@Override 上覆盖其父类中的方法

这是收到错误消息的部分

@Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            BUTTON = (Button) findViewById(R.id.button);

            BUTTON.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    DemoAsync UploadFile = new DemoAsync();
                    UploadFile.execute();
                }
            });

        }

这是 MainActivity.java 上的全部代码

 package com.example.threadexample;

        import androidx.appcompat.app.AppCompatActivity;
        import android.util.Log;
        import android.os.AsyncTask;
        import android.os.Bundle;
        import android.view.View;
        import android.widget.Button;
        import android.widget.TextView;


        public class MainActivity extends AppCompatActivity {

            public static final String DEMO_ASYNC = "DemoAsync";
            private TextView B_PRESSED;
            Button BUTTON;

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                B_PRESSED = (TextView) findViewById(R.id.myTextView);
                DemoAsync demoAsync = new DemoAsync();
                demoAsync.execute("Button Pressed");

            }

            private class DemoAsync extends AsyncTask<String, Void, String> {
                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }

                protected String doInBackground(String... params) {

                    Log.d(DEMO_ASYNC, "status : doInBackground");
                    try {
                        Thread.sleep(20000);
                    } catch (Exception e) {
                        Log.d(DEMO_ASYNC, e.getMessage());
                    }
                    return params[0];
                }

                @Override
                protected void onPostExecute(String s) {
                    super.onPostExecute(s);
                    B_PRESSED.setText(s);
                }

                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);

                    BUTTON = (Button) findViewById(R.id.button);

                    BUTTON.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            DemoAsync UploadFile = new DemoAsync();
                            UploadFile.execute();
                        }
                    });

                }
            }
        }

请详细说明我应该更改哪个部分,我是新手。感谢您的理解。

【问题讨论】:

    标签: java android android-studio


    【解决方案1】:

    试试这个,希望能成功

    
    package com.example.threadexample;
    
    import androidx.appcompat.app.AppCompatActivity;
    import android.util.Log;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import com.marsad.wallpaperapp.R;
    
    
    public class MainActivity extends AppCompatActivity {
    
        public static final String DEMO_ASYNC = "DemoAsync";
        private TextView B_PRESSED;
        Button BUTTON;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            B_PRESSED = (TextView) findViewById(R.id.myTextView);
            DemoAsync demoAsync = new DemoAsync();
            demoAsync.execute("Button Pressed");
    
            BUTTON = (Button) findViewById(R.id.button);
    
            BUTTON.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    DemoAsync UploadFile = new DemoAsync();
                    UploadFile.execute();
                }
            });
    
        }
    
        private class DemoAsync extends AsyncTask<String, Void, String> {
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }
    
            protected String doInBackground(String... params) {
    
                Log.d(DEMO_ASYNC, "status : doInBackground");
                try {
                    Thread.sleep(20000);
                } catch (Exception e) {
                    Log.d(DEMO_ASYNC, e.getMessage());
                }
                return params[0];
            }
    
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                B_PRESSED.setText(s);
            }
        }
    }
    
    

    【讨论】:

    • 它有效,谢谢,您能否提供一些关于为什么我的代码不起作用的原因?即使我设法在虚拟 android 手机 4.0.3 上执行程序,它仍然会返回错误消息
    • 在我点击按钮几秒钟后它突然停止并且“Button Pressed”字符串出现
    • 这是因为 onCreate 方法已经定义,但您创建了另一个方法,这就是发生此错误的原因
    • 抱歉,我刚刚意识到这些程序可以正常工作,但它并没有完全按照我的意愿工作。我的意思是即使我没有按下按钮,文本会在 20 秒后自行更改,我该怎么办?
    • 是的,谢谢,但它仍然会自行关闭,有人知道为什么吗?
    【解决方案2】:
    03-30 18:59:49.026 3179-3196/com.example.threadexample W/dalvikvm: threadid=11: thread exiting with uncaught exception (group=0x9800f180)
    03-30 18:59:49.026 3179-3196/com.example.threadexample E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
        java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:278)
            at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:856)
         Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
            at com.example.threadexample.MainActivity$DemoAsync.doInBackground(MainActivity.java:52)
            at com.example.threadexample.MainActivity$DemoAsync.doInBackground(MainActivity.java:38)
            at android.os.AsyncTask$2.call(AsyncTask.java:264)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
            at java.lang.Thread.run(Thread.java:856) 
    03-30 18:59:49.846 3179-3179/com.example.threadexample D/OpenGLRenderer: Flushing caches (mode 0)
    03-30 18:59:50.386 3179-3179/com.example.threadexample D/EGL_emulation: eglMakeCurrent: 0x91275f8: ver 2 0
    03-30 18:59:50.386 3179-3179/com.example.threadexample D/OpenGLRenderer: Flushing caches (mode 1)
    

    【讨论】:

    • 删除这个答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多