2017-01-18 3 views
-4

В настоящее время я пытаемся сделать вид списка с изображениями и текстом, но в то время как я компилируется весь код перед Этой проблемой ОШИБКИ:java.lang.NullPointerException: Попытка вызвать виртуальный метод на нулевой ссылке на объект

FATAL EXCEPTION: main 
                    Process: com.example.vishal.stormy, PID: 7884 
                    java.lang.NullPointerException: Attempt to invoke virtual method 'com.example.vishal.stormy.Day[] com.example.vishal.stormy.Forecast.getDailyForecast()' on a null object reference 
                     at com.example.vishal.stormy.MainActivity$2.onClick(MainActivity.java:115) 
                     at android.view.View.performClick(View.java:5207) 
                     at android.view.View$PerformClick.run(View.java:21177) 
                     at android.os.Handler.handleCallback(Handler.java:739) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:148) 
                     at android.app.ActivityThread.main(ActivityThread.java:5441) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 

MainActivity.Java

public class MainActivity extends AppCompatActivity { 
public static final String TAG = MainActivity.class.getSimpleName(); 
public static final String DAILY_FORECAST = "DAILY_FORECAST"; 

private Forecast mForecast; 
private Current mCurrent; 
private TextView mtemperatureLabel; 
private TextView mtimeLabel; 
private TextView mhumidityLabel; 
private TextView mprecipLabel; 
private ImageView IconImageView; 
private TextView SummaryLabel; 
private Button DailyButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mtemperatureLabel = (TextView)findViewById(R.id.temperatureLabel); 
    mtimeLabel = (TextView)findViewById(R.id.timeLabel); 
    mhumidityLabel = (TextView)findViewById(R.id.humidityLabel); 
    mprecipLabel = (TextView)findViewById(R.id.precipLabel); 
    IconImageView= (ImageView) findViewById(R.id.StormyIcon); 
    mtimeLabel = (TextView)findViewById(R.id.timeLabel); 
    SummaryLabel = (TextView)findViewById(R.id.summaryLabel); 
    DailyButton=(Button)findViewById(R.id.DailyButton); 



    String apiKey = "27974c4bc33201748eaf542a6769c3b7"; 
    double latitude = 28.7041; 
    double longitude = 77.1025; 
    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(Call call, IOException e) { 

      } 

      @Override 
      public void onResponse(Call call, Response response) throws IOException { 
       try { 
        String jsonData = response.body().string(); 
        Log.v(TAG, jsonData); 
        if (response.isSuccessful()) { 
         mCurrent = getCurrentDetails(jsonData); 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           updateDisplay(); 
          } 
         }); 

        } else { 
         alertUserAboutError(); 
        } 
       } 
       catch (IOException e) { 
        Log.e(TAG, "Exception caught: ", e); 
       } 
       catch (JSONException e) { 
        Log.e(TAG, "Exception caught: ", e); 
       } 
      } 
     }); 
    } 
    else { 
     Toast.makeText(this, getString(R.string.network_unavailable_message), 
       Toast.LENGTH_LONG).show(); 
    } 

    Log.d(TAG, "Main UI code is running!"); 

    DailyButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(MainActivity.this,DailyForecastActivity.class); 
      intent.putExtra(DAILY_FORECAST, mForecast.getDailyForecast()); 
      startActivity(intent); 
     } 
    }); 
} 


private void updateDisplay() { 

    mtemperatureLabel.setText(mCurrent.getMtemperature()+""); 
    mtimeLabel.setText(mCurrent.getMtime()+""); 
    mhumidityLabel.setText(mCurrent.getMhumidity()+""); 
    mprecipLabel.setText(mCurrent.getMprecipchance()+""); 
    SummaryLabel.setText(mCurrent.getMsummary()+""); 



} 

private Current getCurrentDetails(String jsonData) throws JSONException { 
    JSONObject forecast = new JSONObject(jsonData); 
    String timezone = forecast.getString("timezone"); 
    Log.i(TAG, "From JSON: " + timezone); 

    JSONObject currently = forecast.getJSONObject("currently"); 

    Current current = new Current(); 
    current.setMhumidity(currently.getDouble("humidity")); 
    current.setMtime(currently.getLong("time")); 
    current.setIcon(currently.getString("icon")); 
    current.setMprecipchance(currently.getDouble("precipProbability")); 
    current.setMsummary(currently.getString("summary")); 
    current.setMtemperature(currently.getDouble("temperature")); 
    current.setMtimezone(timezone); 

    Log.d(TAG, current.getFormattedTime()); 

    return current; 
} 


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"); 
}} 

Day.java

public class Day implements Parcelable { 
private long mtime; 
private String mSummary; 
private double mTemperatureMax; 
private String mIcon; 
private String mTimezone; 

private Current current; 

private Day(Parcel in) { 
    mtime = in.readLong(); 
    mSummary = in.readString(); 
    mTemperatureMax = in.readDouble(); 
    mIcon = in.readString(); 
    mTimezone = in.readString(); 
} 


public String getSummary() { 
    return mSummary; 
} 

public void setSummary(String summary) { 
    mSummary = summary; 
} 

public long getMtime() { 
    return mtime; 
} 

public void setMtime(long mtime) { 
    this.mtime = mtime; 
} 

public int getTemperatureMax() { 
    return (int)Math.round(mTemperatureMax); 
} 

public void setTemperatureMax(double temperatureMax) { 
    mTemperatureMax = temperatureMax; 
} 

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); 
} 

public String getDayOfTheWeek(){ 
    SimpleDateFormat formatter = new SimpleDateFormat("EEEE"); 
    formatter.setTimeZone(TimeZone.getTimeZone(mTimezone)); 
    Date dateTime = new Date(mtime*1000); 
    return formatter.format(dateTime); 

} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 

    dest.writeLong(mtime); 
    dest.writeString(mSummary); 
    dest.writeDouble(mTemperatureMax); 
    dest.writeString(mIcon); 
    dest.writeString(mTimezone); 

} 
public Day(){ } 

public static final Creator<Day> CREATOR = new Creator<Day>() { 
    @Override 
    public Day createFromParcel(Parcel source) { 
     return new Day(source); 
    } 

    @Override 
    public Day[] newArray(int size) { 
     return new Day[size]; 


    } 
}; 

}

DailyForecastActivity.java

public class DailyForecastActivity extends ListActivity { 

private Day mDays[]; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_daily_forecast); 

    Intent intent = getIntent(); 
    Parcelable[] parcelables = intent.getParcelableArrayExtra(MainActivity.DAILY_FORECAST); 
    mDays= Arrays.copyOf(parcelables, parcelables.length,Day[].class); 
    DayAdapter adapter = new DayAdapter(this, mDays); 
    setListAdapter(adapter); 

}} 

DayAdapter.java

public class DayAdapter extends BaseAdapter { 

private Context mContext; 
private Day[] mdays; 

public DayAdapter(Context context,Day[] 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){ 
     convertView= LayoutInflater.from(mContext).inflate(R.layout.daily_list_item,null); 
     holder = new ViewHolder(); 
     holder.iconImageView = (ImageView)convertView.findViewById(R.id.iconImageView); 
     holder.temperatureLabel= (TextView)convertView.findViewById(R.id.temperatureLabel); 
     holder.dayLabel = (TextView)convertView.findViewById(R.id.dayNameLabel); 

     convertView.setTag(holder); 

    } 

    else{ 
     holder= (ViewHolder)convertView.getTag(); 

    } 

    Day day = mdays[position]; 
    holder.iconImageView.setImageResource(day.getIconId()); 
    holder.temperatureLabel.setText(day.getTemperatureMax()+""); 
    holder.dayLabel.setText(day.getDayOfTheWeek()); 

    return convertView; 
} 

private static class ViewHolder { 
ImageView iconImageView; 
TextView temperatureLabel; 
TextView dayLabel;}} 
+0

вы ничего не пишете в своем значении 'mForecast' и пытаетесь вызвать его метод. –

ответ

1

В MainActivity, вы не инициализирован mForecast. Это просто объявлено.

private Forecast mForecast; 

и вы пытаетесь использовать его без инициализации на линии 115:

intent.putExtra(DAILY_FORECAST, mForecast.getDailyForecast()); 

Инициализировать его должным образом, а затем использовать его.

+0

Спасибо, работало для меня! –

Смежные вопросы