好吧,我尝试了经典的方法调用策略,但未能成功。我想要的是从每日调用getDayOfTheWeek()和其他get方法。
MainActivity.java
public class MainActivity extends AppCompatActivity {
public static final String TAG = MainActivity.class.getSimpleName();
public static final String DAILY_FORECAST = "DAILY_FORECAST";
public static final String HOURLY_FORECAST = "HOURLY_FORECAST";
private Forecast mForecast;
NotificationManager notificationManager;
boolean isNotificActive = false;
int notifID = 33;
@Bind(R.id.timeLabel)
TextView mTimeLabel;
@Bind(R.id.tempLabel)
TextView mTempLabel;
@Bind(R.id.humidityValue)
TextView mHumidityValue;
@Bind(R.id.precipValue)
TextView mPrecipValue;
@Bind(R.id.summaryLabel)
TextView mSummaryLabel;
@Bind(R.id.windSpeedValue)
TextView mWindSpeedValue;
@Bind(R.id.relativeLayout)
RelativeLayout mRelativeLayout;
@Bind(R.id.container)
SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.locationLabel)
TextView mLocationLabel;
@Bind(R.id.notifButton)
ImageButton mNotifButton;
double latitude;
double longitude;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
final GPSTracker gpsTracker = new GPSTracker(this);
Calendar calendar = Calendar.getInstance();
mSwipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN, Color.BLUE, Color.CYAN);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(false);
}
}, 1750);
gpsTracker.getLocation();
double x = gpsTracker.getLatitude();
double y = gpsTracker.getLongitude();
if (x == 0.00 || y == 0.00) {
Toast.makeText(MainActivity.this, "Location is not enabled", Toast.LENGTH_LONG).show();
} else {
getForecast(gpsTracker);
}
}
});
double x = gpsTracker.getLatitude();
double y = gpsTracker.getLongitude();
if (x == 0.00 || y == 0.00) {
gpsTracker.showSettingsAlert();
} else {
getForecast(gpsTracker);
}
setAlarm(calendar);
}
public void showNotification(View view) {
Currently currently = mForecast.getCurrently();
NotificationCompat.Builder notificBuilder = new NotificationCompat.Builder(this)
.setContentTitle("Weather")
.setContentText(currently.getSummary() + " and Temperature: " + currently.getTemperature())
.setTicker("Current Weather")
.setSmallIcon(R.drawable.clear_nighticon);
Intent moreInfoIntent = new Intent(this, MainActivity.class);
TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(this);
taskStackBuilder.addParentStack(MainActivity.class);
taskStackBuilder.addNextIntent(moreInfoIntent);
PendingIntent pendingIntent = taskStackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
notificBuilder.setContentIntent(pendingIntent);
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notifID, notificBuilder.build());
isNotificActive = true;
}
public void stopNotification(View view) {
if(isNotificActive) {
notificationManager.cancel(notifID);
}
}
public void setAlarm(Calendar calendar) {
Intent alertIntent = new Intent(this, Receiver.class);
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alertIntent, 0);
calendar.set(Calendar.HOUR_OF_DAY, 21);
calendar.set(Calendar.MINUTE, 26);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),24*60*60*1000, pendingIntent);
}
@Override
protected void onStart() {
super.onStart();
GPSTracker gpsTracker = new GPSTracker(this);
gpsTracker.getLocation();
double x = gpsTracker.getLatitude();
double y = gpsTracker.getLongitude();
if (x == 0.00 || y == 0.00) {
} else {
getForecast(gpsTracker);
}
}
@Override
protected void onRestart() {
super.onRestart();
}
public void getForecast(final GPSTracker gpsTracker) {
latitude = gpsTracker.getLatitude();
longitude = gpsTracker.getLongitude();
String apiKey = "7d22cdb138cd70f2e9e8d2006cd0461c";
String forecastUrl = "https://api.forecast.io/forecast/" + apiKey
+ "/" + latitude + "," + longitude;
if (isNetworkAvailable()) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(forecastUrl).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
alertUserAboutError();
}
@Override
public void onResponse(Response response) throws IOException {
try {
String jsonData = response.body().string();
Log.v(TAG, jsonData);
if (response.isSuccessful()) {
mForecast = parseForecastDetails(jsonData);
runOnUiThread(new Runnable() {
@Override
public void run() {
updateDisplay(gpsTracker);
}
});
} else {
alertUserAboutError();
}
} catch (IOException |
JSONException e
)
{
Log.e(TAG, "Exception caught: ", e);
}
}
});
} else {
gpsTracker.showSettingsAlert2();
}
}
private void updateDisplay(GPSTracker gpsTracker) {
Currently currently = mForecast.getCurrently();
String area = gpsTracker.getSubLocality(this);
String city = gpsTracker.getAdminArea(this);
String country = gpsTracker.getCountryName(this);
mLocationLabel.setText(area + "\n" + city + ", " + country);
mTempLabel.setText(currently.getTemperature() + "");
mTimeLabel.setText(currently.getFormattedTime());
mHumidityValue.setText((int) (currently.getHumidity()) + "%");
mPrecipValue.setText((int) (currently.getPrecipChance()) + "%");
mSummaryLabel.setText(currently.getSummary());
mWindSpeedValue.setText((int) (currently.getWindSpeed()) + "");
Drawable drawable = getResources().getDrawable(currently.getBackgroundId());
mRelativeLayout.setBackground(drawable);
}
private Forecast parseForecastDetails(String jsonData) throws JSONException {
Forecast forecast = new Forecast();
forecast.setCurrently(getCurrentlyDetails(jsonData));
forecast.setHourlyForecast(getHourlyForecast(jsonData));
forecast.setDailyForecast(getDailyForecast(jsonData));
return forecast;
}
private Daily[] getDailyForecast(String jsonData) throws JSONException {
JSONObject forecast = new JSONObject(jsonData);
String timezone = forecast.getString("timezone");
JSONObject jsonDaily = forecast.getJSONObject("daily");
JSONArray data = jsonDaily.getJSONArray("data");
Daily[] days = new Daily[data.length()];
for (int i = 0; i < data.length(); i++) {
JSONObject daily = data.getJSONObject(i);
Daily day = new Daily();
day.setSummary(daily.getString("summary"));
day.setTempMax(daily.getDouble("temperatureMax"));
day.setTempMin(daily.getDouble("temperatureMin"));
day.setIcon(daily.getString("icon"));
day.setTime(daily.getLong("time"));
day.setTimezone(timezone);
days[i] = day;
}
return days;
}
private Hourly[] getHourlyForecast(String jsonData) throws JSONException {
JSONObject forecast = new JSONObject(jsonData);
String timezone = forecast.getString("timezone");
JSONObject jsonHourly = forecast.getJSONObject("hourly");
JSONArray data = jsonHourly.getJSONArray("data");
Hourly[] hours = new Hourly[data.length()];
for (int i = 0; i < data.length(); i++) {
JSONObject hourly = data.getJSONObject(i);
Hourly hour = new Hourly();
hour.setSummary(hourly.getString("summary"));
hour.setTemp(hourly.getDouble("temperature"));
hour.setIcon(hourly.getString("icon"));
hour.setTime(hourly.getLong("time"));
hour.setHumidity(hourly.getDouble("humidity"));
hour.setWindSpeed(hourly.getDouble("windSpeed"));
hour.setTimezone(timezone);
hours[i] = hour;
}
return hours;
}
private Currently getCurrentlyDetails(String jsonData) throws JSONException {
JSONObject forecast = new JSONObject(jsonData);
String timezone = forecast.getString("timezone");
JSONObject currently = forecast.getJSONObject("currently");
Currently currentWeather = new Currently();
currentWeather.setHumidity(currently.getDouble("humidity"));
currentWeather.setTime(currently.getLong("time"));
currentWeather.setPrecipChance(currently.getDouble("precipProbability"));
currentWeather.setSummary(currently.getString("summary"));
currentWeather.setTemperature(currently.getDouble("temperature"));
currentWeather.setWindSpeed(currently.getDouble("windSpeed"));
currentWeather.setTimeZone(timezone);
currentWeather.setBackgroundId(currently.getString("icon"));
Log.d(TAG, currentWeather.getFormattedTime());
return currentWeather;
}
private boolean isNetworkAvailable() {
ConnectivityManager manager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
boolean isAvailable = false;
if (networkInfo != null && networkInfo.isConnected()) {
isAvailable = true;
}
return isAvailable;
}
private void alertUserAboutError() {
AlertDialogFragment dialog = new AlertDialogFragment();
dialog.show(getFragmentManager(), "error_dialog");
}
@OnClick(R.id.dailyButton)
public void startDailyActivity(View view) {
GPSTracker gpsTracker = new GPSTracker(this);
double x = gpsTracker.getLatitude();
double y = gpsTracker.getLongitude();
if (isNetworkAvailable()) {
if (x == 0.00 || y == 0.00) {
Toast.makeText(MainActivity.this, "Please enable Location services", Toast.LENGTH_LONG).show();
} else {
Intent intent = new Intent(this, DailyForecastActivity.class);
intent.putExtra(DAILY_FORECAST, mForecast.getDailyForecast());
startActivity(intent);
}
} else {
Toast.makeText(this, "Please enable Network services", Toast.LENGTH_LONG).show();
}
}
@OnClick(R.id.hourlyButton)
public void startHourlyActivity(View view) {
GPSTracker gpsTracker = new GPSTracker(this);
double x = gpsTracker.getLatitude();
double y = gpsTracker.getLongitude();
if (isNetworkAvailable()) {
if (x == 0.00 || y == 0.00) {
Toast.makeText(MainActivity.this, "Please enable Location services", Toast.LENGTH_LONG).show();
} else {
Intent intent = new Intent(this, HourlyForecastActivity.class);
intent.putExtra(HOURLY_FORECAST, mForecast.getHourlyForecast());
startActivity(intent);
}
} else {
Toast.makeText(this, "Please enable Network services", Toast.LENGTH_LONG).show();
}
}
}
Daily.java:
public class Daily implements Parcelable{
private long mTime;
private String mSummary;
private double mTempMax;
private String mIcon;
private String mTimezone;
private double mTempMin;
public String getDayOfTheWeek() {
SimpleDateFormat formatter = new SimpleDateFormat("EEEE");
formatter.setTimeZone(TimeZone.getTimeZone(mTimezone));
Date dateTime = new Date(mTime * 1000);
return formatter.format(dateTime);
}
public double getTempMin() {
double celciusTemp = 100 * (mTempMin - 32) / 180;
return (int)Math.round(celciusTemp);
}
public void setTempMin(double tempMin) {
mTempMin = tempMin;
}
public long getTime() {
return mTime;
}
public void setTime(long time) {
mTime = time;
}
public String getSummary() {
return mSummary;
}
public void setSummary(String summary) {
mSummary = summary;
}
public double getTempMax() {
double celciusTemp = 100 * (mTempMax - 32) / 180;
return (int)Math.round(celciusTemp);
}
public void setTempMax(double tempMax) {
mTempMax = tempMax;
}
public String getIcon() {
return mIcon;
}
public void setIcon(String icon) {
mIcon = icon;
}
public String getTimezone() {
return mTimezone;
}
public void setTimezone(String timezone) {
mTimezone = timezone;
}
public int getIconId(){
return Forecast.getIconId(mIcon);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(mTime);
dest.writeString(mSummary);
dest.writeDouble(mTempMax);
dest.writeDouble(mTempMin);
dest.writeString(mIcon);
dest.writeString(mTimezone);
}
private Daily(Parcel in){
mTime = in.readLong();
mSummary = in.readString();
mTempMax = in.readDouble();
mTempMin = in.readDouble();
mIcon = in.readString();
mTimezone = in.readString();
}
public Daily(){
}
public static final Creator<Daily> CREATOR = new Creator<Daily>() {
@Override
public Daily createFromParcel(Parcel source) {
return new Daily(source);
}
@Override
public Daily[] newArray(int size) {
return new Daily[size];
}
};
}
Receive.java:
public class Receiver extends BroadcastReceiver{
Daily day = new Daily();
@Override
public void onReceive(Context context, Intent intent) {
createNotification(context,
day.getDayOfTheWeek(),
day.getSummary() + " and Max: " + day.getTempMax() + " Min: " + day.getTempMin(),
"Your Daily Weather");
}
public void createNotification(Context context, String msg,
String msgText, String msgAlert) {
PendingIntent pi = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
.setSmallIcon(day.getIconId())
.setContentTitle(msg)
.setContentText(msgText)
.setTicker(msgAlert);
mBuilder.setContentIntent(pi);
mBuilder.setDefaults(NotificationCompat.DEFAULT_SOUND);
mBuilder.setAutoCancel(true);
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(1, mBuilder.build());
}
}
看,问题是即使在许多情况下这是正确的呼叫方式,但这个方法失败了。我不知道问题是什么,我声明了一个Daily变量,用它来调用方法,那些getBLA()方法返回String所以它也没关系...... 请注意,Daily.java中也存在其他get方法,但我只想关注其中一个。他们都没有工作。非常感谢任何帮助。如果这些代码中没有错误,我可以提供整件事。请告诉我。
DayAdapter.java
public class DayAdapter extends BaseAdapter{
private Context mContext;
private Daily[] mDays;
public DayAdapter(Context context, Daily[] days){
mContext = context;
mDays = days;
}
@Override
public int getCount() {
return mDays.length;
}
@Override
public Object getItem(int position) {
return mDays[position];
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null){
// brand new
convertView = LayoutInflater.from(mContext).inflate(R.layout.daily_list_item, null);
holder = new ViewHolder();
holder.iconImageView = (ImageView) convertView.findViewById(R.id.iconImageView);
holder.tempLabel = (TextView) convertView.findViewById(R.id.tempLabel);
holder.dayLabel = (TextView) convertView.findViewById(R.id.dayNameLabel);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Daily day = mDays[position];
holder.iconImageView.setImageResource(day.getIconId());
holder.tempLabel.setText(((int)day.getTempMax()) + "/" + ((int)day.getTempMin()));
if (position == 0){
holder.dayLabel.setText("Today");
} else {
holder.dayLabel.setText(day.getDayOfTheWeek());
}
return convertView;
}
private static class ViewHolder {
ImageView iconImageView;
TextView tempLabel;
TextView dayLabel;
}
}
DailyForecastActivity.java
public class DailyForecastActivity extends AppCompatActivity {
private Daily[] mDays;
String dayoftheweek;
@Bind(android.R.id.list)
ListView mListView;
@Bind(android.R.id.empty)
TextView mEmptyTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_daily_forecast);
ButterKnife.bind(this);
GPSTracker gpsTracker = new GPSTracker(this);
TextView mLocationLabel = (TextView) findViewById(R.id.locationLabel);
Intent intent = getIntent();
Parcelable[] parcelables = intent.getParcelableArrayExtra(MainActivity.DAILY_FORECAST);
mDays = Arrays.copyOf(parcelables, parcelables.length, Daily[].class);
DayAdapter adapter = new DayAdapter(this, mDays);
mListView.setAdapter(adapter);
mListView.setEmptyView(mEmptyTextView);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String dayOfTheWeek = mDays[position].getDayOfTheWeek();
String condition = mDays[position].getSummary();
if (mDays[position].getSummary().contains("Mixed")) {
condition = "There will be Mixed Precipitation";
}
if (mDays[position].getSummary().contains("Snow")) {
condition = "There will be Snow";
}
if (mDays[position].getSummary().contains("Partly cloudy")) {
condition = "It will be Partly Cloudy";
}
if (mDays[position].getSummary().contains("Light rain")) {
condition = "There will be Light Rain";
}
if (mDays[position].getSummary().contains("Rain")) {
condition = "There will be Rain";
}
String message = String.format("%s Summary: %s", dayOfTheWeek, condition);
Toast.makeText(DailyForecastActivity.this, message, Toast.LENGTH_SHORT).show();
}
});
String area = gpsTracker.getSubLocality(this);
String city = gpsTracker.getAdminArea(this);
String country = gpsTracker.getCountryName(this);
mLocationLabel.setText(area + ", " + city + ", " + country);
}
}
答案 0 :(得分:1)
在Daily
课程中,您已宣布变量
private long mTime;
private String mSummary;
private double mTempMax;
private String mIcon;
private String mTimezone;
private double mTempMin;
我看到您在Daily
方法中创建了createNotification
的新实例,并开始调用get方法。
但是,为所有声明的变量设置的值在哪里?当您在null
方法中为每个方法调用get方法时,它们仍为createNotification
。
您是否缺少设置这些值的方法调用?您应该在Daily
类中创建一个构造函数,在开始获取它们之前设置所有这些变量的值?
如何编写构造函数:
public class Daily implements Parcelable{
private long mTime;
private String mSummary;
private double mTempMax;
private String mIcon;
private String mTimezone;
private double mTempMin;
//constructor
public Daily(long mTime, String mSummary, double mTempMax, String mIcon, String mTimezone, double mTempMin) {
this.mTime = mTime;
this.mSummary = mSummary;
this.mtempMax = mTempMax;
...
...
...
}
// rest of your code below this as it is
现在为Daily Class创建你的实例:
Daily day = new Daily(3131313, "Summary", 107, "icon", "timezone", 91);
// replace these hardcoded values with sensible values from your data source
或者创建一个不带参数的构造函数,并获取值以直接在构造函数中初始化变量。但它适用于你。
在此之后,您的代码应该可以正常工作。