我正在学习Android开发,我想尝试在iOS开发中完成的任何基本程序。问题是获取某个地方的天气状况并在TextView中设置条件。
代码
package com.bh.weather;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONObject;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
class WeatherTask extends AsyncTask<String, Void, String> {
protected void onPostExecute(String json) {
try {
JSONObject jsonObject = new JSONObject(json);
String value = jsonObject.getJSONObject("data")
.getJSONArray("current_condition").getJSONObject(0)
.getJSONArray("weatherDesc").getJSONObject(0)
.getString("value");
Log.d("bh", value);
MainActivity m = new MainActivity();
m.setTextView(value);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected String doInBackground(String... urlTojson) {
String json = new String();
try {
DefaultHttpClient defaultClient = new DefaultHttpClient();
HttpGet httpGetRequest = new HttpGet(urlTojson[0]);
HttpResponse httpResponse = defaultClient.execute(httpGetRequest);
BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
json = reader.readLine();
} catch (Exception e) {
e.printStackTrace();
}
return json;
}
}
public class MainActivity extends Activity implements OnClickListener {
private TextView tv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public void onClick(View v) {
//changed the API key here to xxxxxxxxxxxxxxxx
new WeatherTask().execute("http://free.worldweatheronline.com/feed/weather.ashx?q=Bangalore,India&format=json&num_of_days=1&key=xxxxxxxxxxxxxxxxx");
}
public void setTextView(String v) {
Log.d("bh","Inside setTextView:"+v);
if(v.equals("")) {
Log.d("bh","Value not received");
}
else {
tv = (TextView) findViewById(R.id.textView3);
tv.setText(v);
}
}
}
生成的JSON看起来像这样(jsonviewer.stack.hu可用于查看):
{
"data": {
"current_condition": [
{
"cloudcover": "0",
"humidity": "30",
"observation_time": "01:29 PM",
"precipMM": "0.0",
"pressure": "1017",
"temp_C": "25",
"temp_F": "77",
"visibility": "10",
"weatherCode": "113",
"weatherDesc": [
{
"value": "Clear"
}
],
"weatherIconUrl": [
{
"value": "http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0008_clear_sky_night.png"
}
],
"winddir16Point": "E",
"winddirDegree": "90",
"windspeedKmph": "13",
"windspeedMiles": "8"
}
],
"request": [
{
"query": "Bangalore, India",
"type": "City"
}
],
"weather": [
{
"date": "2013-01-25",
"precipMM": "0.0",
"tempMaxC": "29",
"tempMaxF": "84",
"tempMinC": "15",
"tempMinF": "59",
"weatherCode": "113",
"weatherDesc": [
{
"value": "Sunny"
}
],
"weatherIconUrl": [
{
"value": "http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0001_sunny.png"
}
],
"winddir16Point": "E",
"winddirDegree": "97",
"winddirection": "E",
"windspeedKmph": "17",
"windspeedMiles": "11"
}
]
}
}
activity_main.xml中
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="22dp"
android:text="@string/title" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/textView1"
android:layout_marginLeft="32dp"
android:layout_marginTop="30dp"
android:text="@string/place_name"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView2"
android:layout_below="@+id/textView2"
android:layout_marginTop="36dp"
android:layout_marginLeft="0dp"
android:text="@string/weather_condition" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_centerVertical="true"
android:layout_marginTop="140dp"
android:layout_marginLeft="120dp"
android:text="@string/show_weather" />
</RelativeLayout>
从代码中可以看出,解析后我得到值“Clear”(使用Internet权限集)。但由于某种原因,这不是在TextView中设置的。我不知道我在这里做了什么错。 Logcat正确显示记录的值。请帮忙。
干杯。
答案 0 :(得分:2)
您需要使用Constructor AsyncTask
内部传递活动Context,而不是在AsyncTask中创建它。将您的代码更改为:
class WeatherTask extends AsyncTask<String, Void, String> {
public Context context;
public WeatherTask(Context context){
this.context=context;
}
protected void onPostExecute(String json) {
try {
JSONObject jsonObject = new JSONObject(json);
String value = jsonObject.getJSONObject("data")
.getJSONArray("current_condition").getJSONObject(0)
.getJSONArray("weatherDesc").getJSONObject(0)
.getString("value");
Log.d("bh", value);
context.setTextView(value);
} catch (Exception e) {
e.printStackTrace();
}
}
//your code here....
并从MainActivity传递Activity上下文:
WeatherTask weatherobj=new WeatherTask(MainActivity.this);
weatherobj.execute("http://free.worldweatheronline.com/feed/
weather.ashx?q=Bangalore,India&format=json&num_of_days=1&key=xxxxxxxxxxxxxxxxx");
答案 1 :(得分:1)
尝试
class WeatherTask extends AsyncTask<String, Void, String> {
MainActivity mActivity;
public WeatherTask(MainActivity mActivity){
this.mActivity=mActivity;
}
protected void onPostExecute(String json) {
try {
JSONObject jsonObject = new JSONObject(json);
String value = jsonObject.getJSONObject("data")
.getJSONArray("current_condition").getJSONObject(0)
.getJSONArray("weatherDesc").getJSONObject(0)
.getString("value");
Log.d("bh", value);
mActivity.setTextView(value);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected String doInBackground(String... urlTojson) {
String json = new String();
try {
DefaultHttpClient defaultClient = new DefaultHttpClient();
HttpGet httpGetRequest = new HttpGet(urlTojson[0]);
HttpResponse httpResponse = defaultClient.execute(httpGetRequest);
BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
json = reader.readLine();
} catch (Exception e) {
e.printStackTrace();
}
return json;
}
}
public class MainActivity extends Activity implements OnClickListener {
private TextView tv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public void onClick(View v) {
//changed the API key here to xxxxxxxxxxxxxxxx
new WeatherTask(this).execute("http://free.worldweatheronline.com/feed/weather.ashx?q=Bangalore,India&format=json&num_of_days=1&key=xxxxxxxxxxxxxxxxx");
}
public void setTextView(String v) {
Log.d("bh","Inside setTextView:"+v);
if(v.equals("")) {
Log.d("bh","Value not received");
}
else {
tv = (TextView) findViewById(R.id.textView3);
tv.setText(v);
}
}
}