【问题标题】:Android: How to get boolean result from AsyncTask?Android:如何从 AsyncTask 获取布尔结果?
【发布时间】:2018-09-26 08:56:48
【问题描述】:

我想在我的应用程序中检查互联网连接。我找到了一个代码,但我真的是初学者,所以我不知道如何使用。

我的代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
            //I want something like this.
            if(InternetCheck==true){
                Toast("You are connected to internet")
            }
            else{
            Toast("Connection Failed")
            }

    }

 static class InternetCheck extends AsyncTask<Void,Void,Boolean> {

        private Consumer mConsumer;
        public  interface Consumer { void accept(Boolean internet); }

        public  InternetCheck(Consumer consumer) { mConsumer = consumer; execute(); }

        @Override protected Boolean doInBackground(Void... voids) { try {
            Socket sock = new Socket();
            sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
            sock.close();
            return true;
        } catch (IOException e) { return false; } }

        @Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }
    }

但我不知道如何从 AsyncTask 中获取布尔结果。请教我。

【问题讨论】:

    标签: android android-asynctask connection


    【解决方案1】:
    new InternetCheck(new InternetCheck.Consumer() {
        @Override
        public void accept(Boolean connected) {
            if (connected) {
                Log.d("TAG", "Internet is connected");
            } else {
                Log.d("TAG", "Internet is not connected");
            }     
        }
    }).execute();
    

    【讨论】:

    • 它给了我错误。 java.lang.IllegalStateException:无法执行任务:任务已经在运行。
    • 我删除了 execute(),它的工作原理就像魅力一样,谢谢
    • 它正在使用一个接口,我使用这个没有execute()
    【解决方案2】:

    你可以使用get()AsyncTask获取结果:

    @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                    Boolean result = new InternetCheck().execute().get();
                    if (result == true) {
                        Toast.makeText(this, "You are connected to internet", Toast.LENGTH_LONG).show();
                    } else { 
                        Toast.makeText(this, "Connection Failed", Toast.LENGTH_LONG).show();
                    }
            }
    

    或者您可以在AsyncTask 中检查onPostExecute() 中的布尔结果:

    @Override 
        protected void onPostExecute(Boolean internet) { 
            mConsumer.accept(internet);
            if (internet == true) {
                        Toast.makeText(YourActivity.this, "You are connected to internet", Toast.LENGTH_LONG).show();
                    } else { 
                        Toast.makeText(YourActivity.this, "Connection Failed", Toast.LENGTH_LONG).show();
                    }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      相关资源
      最近更新 更多