为什么异步任务不工作? String-json\u字符串; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } 公共void getJSON(视图){ 新建BackgroundTask().execute(); } 类BackgroundTask扩展了AsyncTask{ 字符串json_url; @凌驾 受保护的void onPreExecute(){ json_url=”http://androidtut.comli.com/json_get_data.php"; } @凌驾 受保护的空位背景(空位…空位){ 试一试{ URL=新URL(json_URL); HttpURLConnection HttpURLConnection=(HttpURLConnection)url.openConnection(); InputStream InputStream=httpURLConnection.getInputStream(); BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream)); StringBuilder StringBuilder=新的StringBuilder(); 而((json_string=bufferedReader.readLine())!=null){ 追加(json_字符串+“\n”); } bufferedReader.close(); inputStream.close(); httpURLConnection.disconnect(); 返回stringBuilder.toString().trim(); } 捕获(格式错误){ e、 printStackTrace(); } 捕获(IOE异常){ e、 printStackTrace(); } 返回null; } @凌驾 受保护的void onProgressUpdate(void…值){ super.onProgressUpdate(值); } @凌驾 受保护的void onPostExecute(字符串结果){ TextView TextView=(TextView)findViewById(R.id.textJSON); setText(结果); } }

为什么异步任务不工作? String-json\u字符串; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } 公共void getJSON(视图){ 新建BackgroundTask().execute(); } 类BackgroundTask扩展了AsyncTask{ 字符串json_url; @凌驾 受保护的void onPreExecute(){ json_url=”http://androidtut.comli.com/json_get_data.php"; } @凌驾 受保护的空位背景(空位…空位){ 试一试{ URL=新URL(json_URL); HttpURLConnection HttpURLConnection=(HttpURLConnection)url.openConnection(); InputStream InputStream=httpURLConnection.getInputStream(); BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream)); StringBuilder StringBuilder=新的StringBuilder(); 而((json_string=bufferedReader.readLine())!=null){ 追加(json_字符串+“\n”); } bufferedReader.close(); inputStream.close(); httpURLConnection.disconnect(); 返回stringBuilder.toString().trim(); } 捕获(格式错误){ e、 printStackTrace(); } 捕获(IOE异常){ e、 printStackTrace(); } 返回null; } @凌驾 受保护的void onProgressUpdate(void…值){ super.onProgressUpdate(值); } @凌驾 受保护的void onPostExecute(字符串结果){ TextView TextView=(TextView)findViewById(R.id.textJSON); setText(结果); } },android,android-asynctask,Android,Android Asynctask,错误:(31,5)错误:MainActivity.BackgroundTask不是抽象的,并且不重写AsyncTask中的抽象方法doInBackground(Void…) 错误:(39,24)错误:MainActivity中的doInBackground(Void…)。BackgroundTask无法覆盖AsyncTask中的doInBackground(Params…) 返回类型Void与字符串不兼容 其中,Params、Result是类型变量: Params扩展类AsyncTask中声明的

错误:(31,5)错误:MainActivity.BackgroundTask不是抽象的,并且不重写AsyncTask中的抽象方法doInBackground(Void…)

错误:(39,24)错误:MainActivity中的doInBackground(Void…)。BackgroundTask无法覆盖AsyncTask中的doInBackground(Params…) 返回类型Void与字符串不兼容 其中,Params、Result是类型变量: Params扩展类AsyncTask中声明的对象 结果扩展了类AsyncTask中声明的对象

错误:(38,9)错误:方法不重写或实现超类型中的方法

错误:(54,53)错误:不兼容的类型:无法将字符串转换为Void

错误:任务“:app:compiledBugJavaWithJavaC.”的执行失败>编译失败;有关详细信息,请参阅编译器错误输出。

AsyncTask

这里的最后一个类型是返回结果类型

您的
doInBackground
当前定义为
Void
,而不是
String

同样,不能将
StringBuilder
字符串结果作为
Void
类型返回



您可能会发现,处理JSON更容易使用

好的,当您在AsyncTask中定义Void时,您应该理解其含义

  • doInBackground是一个参数为空的函数(第一个空),返回一个字符串(最后一个字符串)

    受保护字符串doInBackground()

  • onProgressUpdate是一个参数为空的函数(第二个为空)

    受保护的void onProgressUpdate()

  • onPostExecute是一个具有字符串参数(步骤1中的值)的函数

    受保护的void onPostExecute(字符串)


  • 如果您不能清楚地理解AsyncTask中的函数,最好尝试在AndroidStudio中生成该函数。 以下是AndroidStudio生成的代码

    String json_string;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    public void getJSON (View view){
        new AsynsTask(){
            String json_url;
            @Override
            protected void onPreExecute() {
                json_url = "http://androidtut.comli.com/json_get_data.php";
            }
    
            @Override
            protected Void doInBackground(Void... voids) {
                try {
                    URL url = new URL(json_url);
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    InputStream inputStream = httpURLConnection.getInputStream();
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                    StringBuilder stringBuilder = new StringBuilder();
    
                    while ((json_string = bufferedReader.readLine()) != null) {
    
                        stringBuilder.append(json_string + "\n");
                    }
                    bufferedReader.close();
                    inputStream.close();
                    httpURLConnection.disconnect();
                    return stringBuilder.toString().trim();
    
    
                }
                catch (MalformedURLException e){
                    e.printStackTrace();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
    
            @Override
            protected void onProgressUpdate(Void... values) {
                super.onProgressUpdate(values);
            }
    
            @Override
            protected void onPostExecute(String result) {
                TextView textView = (TextView) findViewById(R.id.textJSON);
                textView.setText(result);
            }
        }.execute();
    
     }
    
    class BackgroundTask扩展了AsyncTask
    {
    @凌驾
    受保护的void onPostExecute(字符串s){
    super.onPostExecute(s);
    }
    @凌驾
    受保护的void onProgressUpdate(void…值){
    super.onProgressUpdate(值);
    }
    @凌驾
    受保护字符串doInBackground(无效…参数){
    返回null;
    }
    }
    

    将您的代码与上面的代码进行比较,我想您会知道答案。

    我在这里发现了两个错误。
    1.对于任务执行,

    class BackgroundTask extends AsyncTask<Void,Void,String>
    {
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }
    
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    
        @Override
        protected String doInBackground(Void... params) {
            return null;
        }
    }
    

    2.doInBackground返回类型应与结果类型(即字符串)匹配

    String-json\u字符串;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }
    公共void getJSON(视图){
    new BackgroundTask().execute(空);
    }
    类BackgroundTask扩展了AsyncTask{
    字符串json_url;
    @凌驾
    受保护的void onPreExecute(){
    json_url=”http://androidtut.comli.com/json_get_data.php";
    }
    @凌驾
    受保护的字符串背景(无效…无效){
    试一试{
    URL=新URL(json_URL);
    HttpURLConnection HttpURLConnection=(HttpURLConnection)url.openConnection();
    InputStream InputStream=httpURLConnection.getInputStream();
    BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream));
    StringBuilder StringBuilder=新的StringBuilder();
    而((json_string=bufferedReader.readLine())!=null){
    追加(json_字符串+“\n”);
    }
    bufferedReader.close();
    inputStream.close();
    httpURLConnection.disconnect();
    返回stringBuilder.toString().trim();
    }
    捕获(格式错误){
    e、 printStackTrace();
    }
    捕获(IOE异常){
    e、 printStackTrace();
    }
    返回null;
    }
    @凌驾
    受保护的void onProgressUpdate(void…值){
    super.onProgressUpdate(值);
    }
    @凌驾
    受保护的void onPostExecute(字符串结果){
    TextView TextView=(TextView)findViewById(R.id.textJSON);
    文本视图
    
    class BackgroundTask extends AsyncTask<Void,Void,String>
    {
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }
    
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    
        @Override
        protected String doInBackground(Void... params) {
            return null;
        }
    }
    
    new BackgroundTask().execute(null);
    
    protected String doInBackground(Void... voids)
    
        String json_string;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void getJSON (View view){
            new BackgroundTask().execute(null);
        }
    
        class BackgroundTask extends AsyncTask <Void, Void, String>{
            String json_url;
            @Override
            protected void onPreExecute() {
                json_url = "http://androidtut.comli.com/json_get_data.php";
            }
    
            @Override
            protected String doInBackground(Void... voids) {
                try {
                    URL url = new URL(json_url);
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    InputStream inputStream = httpURLConnection.getInputStream();
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                    StringBuilder stringBuilder = new StringBuilder();
    
                    while ((json_string = bufferedReader.readLine()) != null) {
    
                        stringBuilder.append(json_string + "\n");
                    }
                    bufferedReader.close();
                    inputStream.close();
                    httpURLConnection.disconnect();
                    return stringBuilder.toString().trim();
    
    
                }
                catch (MalformedURLException e){
                    e.printStackTrace();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
    
            @Override
            protected void onProgressUpdate(Void... values) {
                super.onProgressUpdate(values);
            }
    
            @Override
            protected void onPostExecute(String result) {
                TextView textView = (TextView) findViewById(R.id.textJSON);
                textView.setText(result);
            }
        }