从AsyncTask / doInBackground返回多个值,并在其他方法中使用它

时间:2016-04-04 13:17:00

标签: android methods android-asynctask return-value

这是我用来获取值的方法。

 @Override
    protected Void doInBackground(String... params) {
        try {

            Intent intent = getIntent();
            String dvlaNumFin = intent.getStringExtra("dvlaNumber");

            final TextView outputView = (TextView) findViewById(R.id.showOutput);
            final URL url = new URL("https://dvlasearch.appspot.com/DvlaSearch?licencePlate="+dvlaNumFin+"&apikey=");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setRequestMethod("GET");
            connection.setRequestProperty("USER-AGENT", "Mozilla/5.0");
            connection.setRequestProperty("ACCEPT-LANGUAGE", "en-US,en;0.5");

            final StringBuilder output = new StringBuilder(String.valueOf(url));

           BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line = "";
            StringBuilder responseOutput = new StringBuilder();
            System.out.println("output===============" + br);
            while ((line = br.readLine()) != null) {
                responseOutput.append(line);
            }
            br.close();

            HandleJSON obj = new HandleJSON("");

            obj.readAndParseJSON(responseOutput.toString());

            output.append(System.getProperty("line.separator") + "\n" + System.getProperty("line.separator") + "Make : " + obj.getMake() + "\nModel : " + obj.getModel());
            output.append("\nSix Month Rate  : " + obj.getSixMonthRate() + "\nTwelve Month Rate : " + obj.getTwelveMonthRate() + "\nDate of First Registration : " + obj.getDateofFirstRegistrationegistration());
            output.append("\nYear of Manufacture : " + obj.getYearOfManufacture() + "\nCylinder Capacity : " + obj.getCylinderCapacity() + "\nCO2 Emmissions : " + obj.getCo2Emissions());
            output.append("\nVIN number : " + obj.getVin() + "\nTransmission type : " + obj.getTransmission());

            DVLAresult.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    outputView.setText(output);
                    progress.dismiss();

                }
            });

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

我想使用obj.getMake()等来自JSON的值。但是不明白怎么做,或者归还它。我知道应该是返回值,或者使用final。

4 个答案:

答案 0 :(得分:0)

FOG

只需在AsyncTask类中实现onPostExecute:)

例如:

@Override
protected void onPostExecute(String makeValue) {
    // remember this method gets called on main thread
    letsCallFogsMethod(makeValue); //call your method and pass the make value here :)
}

多数民众赞成:) 为什么这个onPostExecute得到任何值? 你必须从doInBackground方法返回它dude:)

喜欢

@Override
protected String doInBackground(String... params) {
     //after all bra bla simply say
     return obj.getMake();
}

您是否注意到您的doInBackground签名伙伴有任何变化?是的我从Void改为String :)

通过编写String,您将通知执行doInBackground时,您将返回一个字符串到onPostExecute:)

所以,如果我写的答案是否有效?不。 鉴于您已在doInBackground中指定了Void,您的异步任务签名可能类似于

private class FogsAsyncTask extends AsyncTask<bla,blah,Void> {

你能看到最后的虚空吗? :)但是现在你有了chnaged doInBackground不是它所以更新AsyncTask签名:)

private class FogsAsyncTask extends AsyncTask<bla,blah,String> {

现在它应该工作正常:)快乐编码好友:)希望我的回答帮助你:))

答案 1 :(得分:0)

您可以在onPostExecute方法上获取输出,只需覆盖该方法并获取输出

答案 2 :(得分:0)

AsyncTask有三种(主要)方法,onPreExecutedoInBackgroundonPostExecute。只有doInBackGround在后​​台线程上运行,其他两个在UI线程上运行。 (还有onProgressUpdate但我会在这里跳过它)

在您的情况下,在doInBackground方法中返回您想要的任何内容。该返回值将是onPostExecute的输入参数。在那里你可以调用你想要的任何其他(可达)方法。请注意,您当时正在UI线程中运行。

答案 3 :(得分:0)

美好而简单。让AsyncTask返回一个值:

public class TestClass extends AsyncTask<Void, Void, String>{

@Override
protected String doInBackground(String... params) {
//rest of code

return output.toString();
}
}

现在,您只需在调用 .execute()

后调用 .get()方法
TestClass tc = new TestClass();
tc.execute();
String output = tc.get();

非常非常重要的注意事项

通过在.execute()之后调用.get(),您的UI线程将被阻塞,直到AsyncTask完成。这与AsyncTask的目的相反。解决此问题的方法之一是向AsyncTask添加一个回调接口,该接口将在完成时调用,并在该接口的实现中调用.get()方法。有关如何设计回调接口的示例,请参阅here