Приложение Погода вылетает на эмуляторе

РЕШЕНО БОЛЬШОЕ СПАСИБО ВСЕМ

Хелле, и прежде всего спасибо, что нажали на мой вопрос. Я сделал приложение, которое получает json-файл погоды. Затем он анализирует этот файл JSON, чтобы получить погодные переменные, такие как температура и т. д. Он отображает эти переменные в textView. Проблема в том, что когда я нажимаю кнопку (на моем эмуляторе), он говорит: «К сожалению, (имя приложения) перестало работать». Ниже вы можете найти код, который я использовал для всего этого. Помощь будет оценена. Если вам нужны еще файлы, такие как activity_main.xml, strings.xml,... просто спросите.

Спасибо за помощь СПАСИБО ВСЕМ ЗА ПОМОЩЬ, Я ДУМАЮ, ЕСТЬ ЕЩЕ 3 ОШИБКИ, КОТОРЫЕ НУЖНО РЕШИТЬ, НО Я НЕ ПОНИМАЮ ЭТИ ЖУРНАЛЫ ОШИБОК, Я ТОЛЬКО НАЧАЛ ПРОГРАММУ, СПАСИБО ВСЕМ ЗА ПОМОЩЬ (ВЫ МОЖЕТЕ НАЙТИ ИХ ВНИЗУ СТАТЬИ

Основная активность.java:

package com.example.thelexapp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Random;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

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

    final Button button = (Button) findViewById(R.id.button2);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // Perform action on click   
            try {
                getURLforweather();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });

} 

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;

    if (location != null) {

        TextView text = (TextView) findViewById(R.id.textView1);
        text.setTextColor(Color.parseColor("#808080"));
        double longitude = location.getLongitude();
        double latitude = location.getLatitude();
        String longitudestring = String.valueOf(longitude);
        String latitudestring = String.valueOf(latitude);

        String url =     "http://api.worldweatheronline.com/free/v1/weather.ashx?q="
                + longitudestring
                + ","
                + latitudestring
                +   "&format=json&num_of_days=1&key=hv3rd4u49qdmf6q3hp5apy6b";


        parseJson(url);
String temp_C = null;
        String windspeedKmph = null;
        String weatherDesc = null;

        TCWSKMPH(temp_C, windspeedKmph);
        WD(weatherDesc);

    }
}

public void parseJson (String url) {
    DefainputStream = null;
    String result = null;
    try {
        HttpResponse response = httpclient.execute(httppost);           
        HttpEntity entity = response.getEntity();

        in
        String line = null;
        while ((line = reader.readLine()) != null)
        {
            sb.append(line + "\n");
        }
        result = sb.toString();
    } catch (Exception e) { 


    storeJSONVariables(result);

}

public void 
            try {
                JSONObject oneObject = jArrayCurrent.getJSONObject(i);
                JSONArray jArrayWeatherDesc =   jObject.getJSONArray("weatherDesc");
                String temp_C = oneObject.getString("temp_C");
                String windspeedKmph = oneObject.getString("windspeedKmph");

                   // Pulling items from the array
                        String weatherDesc = twoObject.getString("value");  

                        WD(weatherDesc);

                    } catch (JSONException e) {

                    }


public void TCWSKMPH(String temp_C, String windspeedKmph) {

    if(temp_C != null || windspeedKmph != null) {
         RwindspeedKmph.nextInt(max - min + 1) + min;

        temp_C = getString(a);
        windspeedKmph = getString(b);
    }

    TextView temptext = (TextView)findViewById(R.id.temperature);
    TextView sowtext = (TextView)findViewById(R.id.windspeed);
    temptext.setText("TEMPERATURE: " + temp_C);
    sowtext.setText("WINDSPEED: " + windspeedKmph);
}

public void WD(String weatherDesc) {
    String descriptionofweather = weatherDesc;

Логкат:

03-01 11:57:40.760: E/AndroidRuntime(2471):     at com.example.thelexapp.MainActivity.TCWSKMPH(MainActivity.java:190)
03-01 11:57:40.760: E/AndroidRuntime(2471):     at com.example.thelexapp.MainActivity.getURLforweather(MainActivity.java:92)
03-01 11:57:40.760: E/AndroidRuntime(2471):     at com.example.thelexapp.MainActivity$1.onClick(MainActivity.java:42)

person user3357521    schedule 01.03.2014    source источник
comment
Где вы вызвали этот метод getPositionAndGetWheater()? а также опубликуйте свой logcat для лучшего понимания   -  person M D    schedule 01.03.2014
comment
Было бы полезно увидеть трассировку стека при сбое приложения, чтобы понять, в чем причина проблемы.   -  person Roy Hinkley    schedule 01.03.2014
comment
Хм, никогда не замечал, что я нигде его не использовал, но если я нажму кнопку, он запустит getweather (я думаю), текст изменится на «Невозможно получить информацию о погоде» (потому что я не знаю, как использовать GPS в эмуляторе, поэтому возвращает ноль)   -  person user3357521    schedule 01.03.2014
comment
@user3357521 user3357521 попробуй на реальном устройстве, но где твое событие Button onclick(...)? вы НАСТОЯЩИЙ ПРОГРАММИСТ.   -  person M D    schedule 01.03.2014
comment
у меня нет настоящего устройства, я делаю это приложение для друга, у меня есть iphone :s   -  person user3357521    schedule 01.03.2014
comment
@ user3357521 : if I press the button какую кнопку вы нажимаете, пожалуйста, предоставьте как можно больше подробностей.   -  person ρяσѕρєя K    schedule 01.03.2014
comment
Это не трассировка стека. Вы должны посмотреть на вкладке LogCat.   -  person user2340612    schedule 01.03.2014
comment
@user3357521 user3357521, если вы нашли полезный один или несколько ответов, вы должны проголосовать за них. Затем, если есть ответ, который решает проблему (или лучший, если их много), вы должны принять его.   -  person user2340612    schedule 01.03.2014


Ответы (2)


С max=0 и min=20, int a и/или int b становится отрицательным числом-> n<=0 в LogCat.

Кроме того,
1. В эмуляторе вам нужно будет передать значения широты и долготы местоположения. Через Eclipse-DDMS или передать значения непосредственно в коде (с целью тестирования остального кода).
for-"..потому что я не знаю, как использовать GPS в эмуляторе, поэтому он возвращает null"
2. В вашем текущем коде в else части if(location!=null)

final TextView textViewToChange = (TextView) findViewById(R.id.textView1);  
textViewToChange.setText("Unable to get weather information.");  
TextView text = (TextView) findViewById(R.id.textView1);  

Одинаковые ...id.textView1 для text и textViewToChange

Чтобы преобразовать int в String:
String a = String.valueOf(значение int здесь);

проверьте: http://www.tutorialspoint.com/java/java_string_valueof.htm

person Pararth    schedule 01.03.2014
comment
спасибо я решил их все, кроме номера 1, я не знаю, как передавать значения lat и long, я даже не знаю, где находится Eclipse-DDMS, я погуглил и надеюсь на лучшее - person user3357521; 01.03.2014
comment
Проверьте: developer.android.com/tools/debugging/ddms.html и youtube.com/watch?v=MaR30u3PhrU - person Pararth; 01.03.2014
comment
спасибо, я думаю, что я передал значения long и lat, но в части random int все еще есть ошибка, я изменил max на 20 и min на 0, но я думаю, что у него проблемы с преобразованием int в строку... вы знаете какое-нибудь решение? спасибо за помощь ;) - person user3357521; 01.03.2014
comment
я приму ваш ответ, когда он сработает, иначе люди могут подумать, что проблема решена :) - person user3357521; 01.03.2014
comment
все ошибки устранены, но он по-прежнему принимает случайные значения, и я уверен, что я передал значения long и lat в Eclipse DDMS: s - person user3357521; 01.03.2014
comment
мне действительно нужно проверить его с реальными значениями long и lat, потому что этот парсер json выглядит страшно, и он, вероятно, выдаст ошибку - person user3357521; 01.03.2014
comment
Вы отправляли значения во время выполнения? Можно попробовать разместить значения непосредственно в URL-адресе .. для проверки - person Pararth; 01.03.2014
comment
я использовал этот URL-адрес: api.worldweatheronline.com/free/v1/, но по-прежнему пишет, что невозможно получить информацию о погоде: есть идеи? спасибо пользователю 2450263 за всю помощь ;) - person user3357521; 01.03.2014
comment
ссылка неверна, потому что у нее нет ключа API (из соображений безопасности, и она использует xml вместо json, но это правильно в коде, так что не волнуйтесь - person user3357521; 01.03.2014

LogCat показывает, что здесь есть ошибка (строка 173 MainActivity.java):

Caused by: java.lang.IllegalArgumentException: n <= 0: -19
03-01 11:46:33.080: E/AndroidRuntime(2369):     at java.util.Random.nextInt(Random.java:175)
03-01 11:46:33.080: E/AndroidRuntime(2369):     at com.example.thelexapp.MainActivity.TCWSKMPH(MainActivity.java:173)

В частности, входной параметр метода "nextInt" отрицателен.

person user2340612    schedule 01.03.2014