2017-02-28 67 views
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); 
} 
} 

我該怎麼做才能得到這個消息?

回答

2

weather.execute(cityName).get()

當你做get()你等待的AsyncTask完成。因此你正在Ui線程上運行所有繁重的操作。

documentation of get()

如有必要,等待計算完成,然後獲取其結果。

刪除get()

+1

添加到此 - 永遠不會調用.get()。 AsyncTask的要點是並行運行。如果你覺得需要調用get(),那麼首先使用AsyncTask沒有意義。在UI線程中這樣做絕對不是,你會讓整個應用程序無響應,並且可能會被看門狗定時器殺死。 .get合適的次數非常有限。 –

+0

好了,但如果我刪除獲得()我得到一個錯誤「Incompatile類型」。所以我應該使用什麼獲得()而不是,或是否有更好的方式來獲得JSON數據? –

+0

我應該使用onPostExecute()嗎? –

相關問題