Android通过Volley请求WebApi共通

Posted on Leave a commentPosted in Android

思路:

1.把请求网络的方法放到一个类里面

2.创建一个接口将数据发给Activity

3.Activity 实现接口获得服务器返回的数据

4.解析数据

 

来我们一先来看第一步

请求网络

在这里请求网络我们用Volley 。Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。当然Volley对加载图片的时候内存控制的很好,后面加载图片还会用到。

创建一个CallWebservice 类

package org.shuaibi.hi_blog.utils;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import org.json.JSONObject;

import android.content.Context;
import android.widget.Toast;

import com.android.volley.RequestQueue;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

public class CallWebservice  {

    private final String HTTPHOST="http://blog.haojima.net/api/home/";  //主机地址
    public static RequestQueue requestQueue;
    private Context mContnxt; 
    private int mMark;
    private ServiceCallBack mServiceCallBack; 

    public CallWebservice(Context context,String function,HashMap<String, String> params,int mark)
    {
        this.mContnxt=context;
        this.mMark=mark;
        this.mServiceCallBack=(ServiceCallBack) context;
        createUrl(function,params);
    }

    public void createUrl(String function,HashMap<String, String> params)
    {
        //拼主机名和方法名

        String url=this.HTTPHOST+function;
        //拼参数

        if(params!=null){
            url+="?";
            Iterator<Entry<String, String>> iterator = params.entrySet().iterator();
            while (iterator.hasNext()) {
                Entry<String, String> obj = (Entry<String, String>) iterator.next();
                url+=obj.getKey().toString()+"="+obj.getValue().toString()+"&";
            }
            url=url.substring(0, url.length()-1); //去掉最后一个 &
        }
        //请求服务器

        getJsonResult(url);

    }

    public void getJsonResult(String url)
    {
        if(CallWebservice.requestQueue==null)
        {
            requestQueue=Volley.newRequestQueue(mContnxt);
        }
        JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(url, null, new Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                mServiceCallBack.serviceResult(response, mMark);
            }
        }, new ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
             Toast.makeText(mContnxt, error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
        requestQueue.add(jsonObjectRequest);
    }
}

下面来写接口

package org.shuaibi.hi_blog.utils;

import org.json.JSONObject;

/**

 * 

 * @描述: 服务器返回值回调

 * @作者: ZeroX

 * @时间: 2015-9-16

 * @参数: 

 * @接口: 

 *

 */
public interface ServiceCallBack {
    void serviceResult(JSONObject jsonObject,int mark);
}

看见了接口的代码很简单就几句话, 里面的jsonObject 就是服务器返回值 mark 是标记当一个Activity里有多个请求网络的地方 我们就可以用mark 区分哈哈 。

这样请求网络就算完成了,下面介绍用法

HashMap<String, String> params=new HashMap<String, String>();
        params.put("idex",mIndex+"");
        params.put("sizePage", mPageSize+"");
        params.put("ContentLength", "80");
        new CallWebservice(this,"get",params,GETBLOGLIST);

上面代码就是调用一个 方法的写法  里面的GETBLOGLIST 是定义的一个常量我写的1,用来区分多个网络请求的这个数就是 上面接口里的mark

最后就是Activity实现 ServiceCallBack 这个接口了 实现一下serviceResult 这个方法

public class MainActivity extends Activity implements ServiceCallBack
@Override
    public void serviceResult(JSONObject jsonObject, int mark) {
        try {
            switch (mark) {
            case GETBLOGLIST:
                 blogResultHander(jsonObject.getJSONArray("blog"));
mPageCount=jsonObject.getInt("total");
                break;
            default:
                break;
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        }

    }

最后就是解析Json了

 /**

     * 博客列表返回值处理

     * @param jsonArray 博客列表

     */
    public void blogResultHander(JSONArray jsonArray) throws Exception
    {
        for (int i = 0; i &lt; jsonArray.length(); i++) {
            JSONObject jsonObject=jsonArray.getJSONObject(i);
            HashMap&lt;String, String&gt; itemHashMap=new HashMap&lt;String, String&gt;();
            itemHashMap.put("UserName", jsonObject.getJSONObject("BlogUsersSet").getString("UserNickname"));
            itemHashMap.put("CreateTime", jsonObject.getString("BlogCreateTime"));
            itemHashMap.put("Title", jsonObject.getString("BlogTitle"));
            itemHashMap.put("Content", jsonObject.getString("BlogContent"));
            itemHashMap.put("Comment", jsonObject.getString("BlogCommentNum"));
            itemHashMap.put("Visibility", jsonObject.getString("BlogReadNum"));
            mBlogList.add(itemHashMap); //这是一个List&lt;HashMap&lt;String,String&gt;&gt;
        }

    

    }

哈哈我们已经把 重服务器返回的数据放到List里了。

上面代码只是提共参考哟 完整代码请点击这里 

Android Studio配置 AndroidAnnotations

Posted on Leave a commentPosted in Android

以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置。

AndroidAnnotations是一个能够让你快速进行Android开发的开源框架,它能让你专注于真正重要的地方。使代码更加精简,使项目更加容易维护,它的目标就是“Fast Android Development.Easy maintainance”。 说白了 就是可以少写很多代码,哈哈。

AndroidAnnotations是一个开源项目 项目地址 有兴趣的朋友可以去研究一下。好了 废话不多说了。

1 我们需要把 AndroidAnnotations下载下来

2 新建文件夹 compile-libs

3 将androidannotations-3.2.jar 复制到 compile-libs 将 androidannotations-api-3.2.jar 复制到libs下

如:

4 在项目的build.gradle 添加 classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.4’

如:

5 在Model 的build.gradle  添加

5.1 apply plugin: ‘android-apt’

def AAVersion = ‘3.2+’

5.2  apt “org.androidannotations:androidannotations:$AAVersion”
compile “org.androidannotations:androidannotations-api:$AAVersion”
compile ‘com.android.support:support-v4:22.1.1’

5.3 apt {

arguments {

androidManifestFile variant.outputs[0].processResources.manifestFile

resourcePackageName ‘org.shuaibi.hi_blog’

}

}

如:

到这里配置就算完成了 下面来看一下 怎么使用

package org.shuaibi.hi_blog.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;
import org.shuaibi.hi_blog.R;

@EActivity(R.layout.activity_main)  //指定视图
public class MainActivity extends Activity {

    @ViewById(R.id.main_tv_hello)
    TextView mHelloWord; //绑定控件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Click(R.id.main_tv_hello) //点击事件按
    public void hello_Click() {
        Intent intent = new Intent(this, BlogDetailActivity_.class);
        startActivity(intent);
    }


    @AfterViews //视图加载完毕后执行
    public void init() {

        Toast.makeText(this, "视图加载完毕", Toast.LENGTH_SHORT).show();

    }

}

最后 要在 AndroidManifest 文件中 给Activity加上 _ (这是一个下横杠)

如果要在 Eclipse 中配置请 移步到这里–> 传送

对Android Studio 不是很熟 有什么不对的地方请多多指教

AndroidAnnotaions框架使用

Posted on Leave a commentPosted in Android
转眼干Android 也有一些日子了。平时在工作中findViewById和setOnClickListener像这些都是经常写的。一个项目下来,这样的语句会写一大堆。感觉这样的语句写多少遍都不会有什么高。那么问题来了,我们可不可以不写这写语句,答案是坑定的,当然可以。
现在就来介绍我们今天的主角AndroidAnnotaions,这个框架是一个开源框架,大家可以以在GitHub上找到它,这次我们只讨论怎么使用 ,所以就直接下载jar 包 来用。

解压文件能看见两个jar 包

androidannotations-api-3.2.jar
androidannotations-3.2.jar
把androidannotations-api-3.2.jar放到libs 文件夹下
然后在项目中新建一个 文件夹 compile-lib 把下载的androidannotations-3.2.jar放到该文件夹下
右键项目 Build Path -> Configur Build Path ->Java Compiler -> Annotation Processin -> Enable projecr specific settings 打上对号 -> Factory Path ->Add Jars 找到放到 compile-lib 里面的 androidannotations-3.2.jar -> apply
完成上面配置后现在就来 开始使用吧
package org.shuaibi.androidannotions;

import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;

import com.example.androidannotions.R;

import android.os.Bundle;
import android.app.Activity;
import android.widget.Button;
import android.widget.TextView;

@EActivity(R.layout.activity_main) //设置页面视图
public class MainActivity extends Activity {

@ViewById(R.id.btn_main_clickme)  //找id为btn_main_clickme的Button 相当于findViewById
Button mClickMe;
@ViewById(R.id.tv_main_helloword)
TextView mHelloWord;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

@Click(R.id.btn_main_clickme) //给id为btn_main_clickme的Button 设置点击事件
void myButton()
{
mHelloWord.setText("点了我一下");

}

}
上面代码只是简单介绍了AndroidAnnotations 的基本用法。更多用法请参见官方文档