0
我在StackOverflow中檢查瞭解答案,但是我沒有找到太多內容。所以,我正在做這個練習,就像Hello World與JSON一起工作,我得到了來自openweather API的JSON響應。 我在EditText中輸入城市名稱,然後按按鈕搜索並在日誌中顯示JSON字符串。跳過了104幀!該應用程序可能在其主線程上做了太多工作
public class MainActivity extends AppCompatActivity {
EditText city;
public void getData(View view){
String result;
String cityName = city.getText().toString();
getWeather weather = new getWeather();
try {
result = weather.execute(cityName).get();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
public class getWeather extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... urls) {
URL url;
HttpURLConnection connection = null;
String result = "";
try {
String finalString = urls[0];
finalString = finalString.replace(" ", "%20");
String fullString = "http://api.openweathermap.org/data/2.5/forecast?q=" + finalString + "&appid=a18dc34257af3b9ce5b2347bb187f0fd";
url = new URL(fullString);
connection = (HttpURLConnection) url.openConnection();
InputStream in = connection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int data = reader.read();
while(data != -1){
char current = (char) data;
result += current;
data = reader.read();
}
return result;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
city = (EditText) findViewById(R.id.editText);
}
}
我該怎麼做才能得到這個消息?
添加到此 - 永遠不會調用.get()。 AsyncTask的要點是並行運行。如果你覺得需要調用get(),那麼首先使用AsyncTask沒有意義。在UI線程中這樣做絕對不是,你會讓整個應用程序無響應,並且可能會被看門狗定時器殺死。 .get合適的次數非常有限。 –
好了,但如果我刪除獲得()我得到一個錯誤「Incompatile類型」。所以我應該使用什麼獲得()而不是,或是否有更好的方式來獲得JSON數據? –
我應該使用onPostExecute()嗎? –