安卓 天气预报

我想说我刚写的博客不见了,于是打算去玩的计划取消,滚回来重写了

首先呢是设置权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

然后呢我们要导入包

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile files('libs/httpclient-4.4.1.jar')
    compile files('libs/httpcore-4.4.1.jar')
}

导完之后不要忘记加这个

packagingOptions {//导入http包的时候必须要加的以下这段话
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LGPL2.1'
}

好啦 让我们再一次愉快地敲起代码来

首先当然是加线程啦,像访问网络这种复杂的事情,哀家是不会自己做的,发配给我的子民去完成吧

private class thread implements Runnable{
    @Override
    public void run() {
        String todayStart   = "http://api.k780.com:88/?app=weather.today&weaid=";
        String todayCity    = local.getText().toString();
        String todayEnd     = "&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
        String todayWeather = getURLConnection(todayStart + todayCity + todayEnd);
        System.out.println("11111"+todayWeather);
        Message msg = new Message();
        Bundle bundle = new Bundle();
        bundle.putString("todayWeather", todayWeather);
        msg.setData(bundle);
        //getBitmap(URL);
        handler.sendMessage(msg);
    }
}

然后线程中有一个方法是获取接口中的内容

private String getURLConnection(String path){
    String xml = "";
    try {
        HttpClient client = new DefaultHttpClient();//创建一个http对象
        HttpGet    get    = new HttpGet(path);
        HttpResponse response = client.execute(get);
        int code = response.getStatusLine().getStatusCode();//得到http响应结果的状态代码
        Log.d("http", "code");
        if(code==200){
            //getEntity()是获取实体,getContent()是获取数据流
            InputStream reader = response.getEntity().getContent();
            BufferedReader bf = new BufferedReader(new InputStreamReader(reader));
            String list = bf.readLine();//读一行
            while(list!=null){
                xml += list;
                list = bf.readLine();
            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println("22222" + xml);
    return xml;
}
做完之后呢  要使用handler处理一下

public class Myhandler extends Handler {
    public void handleMessage(Message msg)  {

        String todayWeather = msg.getData().getString("todayWeather");
        if(!todayWeather.equals("")){
            try {
                todayWeather = String.valueOf(new JSONObject(todayWeather).getJSONObject("result"));
                JSONObject json = new JSONObject(todayWeather);
                time.setText(json.getString("days"));
                temp.setText(json.getString("temperature"));
                weather.setText(json.getString("weather"));
                wind.setText(json.getString("wind"));

                    URL = json.getString("weather_icon");
                    thread2 t2 = new thread2();
                    t2.start();
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }
}
在handler里面通过json解析,获取我们要的东西啦

如果宝宝们还想通过天气更改图标的话就要再加一个线程啦

private class thread2 extends Thread{
    @Override
    public void run() {
        try{
        URL myUrl = new URL(URL);
        HttpURLConnection conn = (HttpURLConnection)myUrl.openConnection();
        conn.setDoInput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("GET");
        conn.connect();
        Log.d("abc",String.valueOf(conn.getResponseCode()));
        InputStream is = conn.getInputStream();
        Log.d("is", String.valueOf(is));
        bitmap = BitmapFactory.decodeStream(is);
        Log.d("nine", "true");
        is.close();
        Message m = Message.obtain();
            m.what=2;
            phandler.sendMessage(m);
        Log.d("is","true");
    } catch (Exception e) {
        e.printStackTrace();
    }
    Log.d("bitmap", "true");
    }
}
然后处理,将获取的图片添加到ui中

public class Phandler extends Handler {
    public void handleMessage(Message msg) {
          if(msg.what==2){
              pic.setImageBitmap(bitmap);
          }

    }
}
由于我一开始对线程不太理解,所以在这里浪费了很多时间,其实就是主线程呢自己不想做太复杂的事情,然后他就把事情交给苦逼的子线程去做,子线程做完了呢,主线程使用handler处理一下就ok了.

好啦,终于把总结写完了,安卓学了这么久也还是不太会,有啥理解错的就告诉我吧,这次我真的要开心的去玩耍了微笑

你可能感兴趣的:(android,安卓,天气预报)