这是我用来获取值的方法。
@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。
答案 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
有三种(主要)方法,onPreExecute
,doInBackground
和onPostExecute
。只有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。