SSH服務器與Android通信(2)--Android客戶端接收數據


基本原理是Android客戶端通過HttpClient向服務器發出請求,服務器向Android客戶端返回JSON字符串,Android客戶端解析JSON字符串獲得數據。

1. 新建一個Android項目,主要文件如下:

其中MainActivity是UI,CommThread是通信線程,負責和服務器通信,Util是工具類,Var存放變量。

2. Var.java:

package com.hzhi.school.util;

import java.util.ArrayList;
import java.util.List;

public class Var {
    
    // 訪問的URL
    public static String strHost = new String("http://192.168.1.100:8080/School/");
    public static String strAct = new String("aclasquery");
    public static String strURL = strHost + strAct;
    
    // 列表
    public static List lstId = new ArrayList();
    public static List lstName = new ArrayList();
    public static List lstComm = new ArrayList();
    
    // 屏幕的尺寸
    public static int wid_scr;
    public static int hei_scr;
    
    // 消息類型
    public static final int msg_connect = 1;
    public static final int msg_error = 2;
    public static final int msg_con_start = 3;
    public static final int msg_con_stop = 4;

}

3. Util.java:

package com.hzhi.school.util;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class Util {
    
    // 構造類
    public Util(){
        
    }
    
    // 將InputStream格式轉化為StringBuilder格式
    public static StringBuilder is2sb (InputStream is) {
        
        String ln = "";
        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        try{
            while ((ln=br.readLine()) != null){
                sb.append(ln);
            }
            
        }catch(Exception e){
            e.printStackTrace();
        }
        return sb;
        
    }
    
    // JSON轉換成List
    public static void json2list(String strJson) throws JSONException {

        JSONObject jsonObject = new JSONObject(strJson);
        JSONArray jsonClas = jsonObject.getJSONArray("Classes");
        for (int i=0; i<jsonClas.length(); i++){
            Var.lstId.add(i, jsonClas.getJSONObject(i).getString("id"));
            Var.lstName.add(i, jsonClas.getJSONObject(i).getString("name"));
            Var.lstComm.add(i, jsonClas.getJSONObject(i).getString("comment"));
        }

    }

}

4. CommThread.java:

package com.hzhi.school.comm;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.Bundle;
import android.os.Message;
import android.util.Log;

import com.hzhi.school.MainActivity;
import com.hzhi.school.util.Util;
import com.hzhi.school.util.Var;

public class CommThread extends Thread{    

    // 消息變量
    private Message msg;
    private Bundle bdl;
    
    // 構造函數
    public void run(){
        
        InputStream resIS;
        StringBuilder resSB;
        String resStr;
        
        resIS = getIS(Var.strURL);
        if (resIS == null)
        {
            return;
        }
        else
        {
            resSB = Util.is2sb(resIS);
            resStr = resSB.toString();
            try{
                Util.json2list(resStr);
                sendMessage(Var.msg_connect,"");
            }catch (Exception e){
                e.printStackTrace();
                sendMessage(Var.msg_error,e.toString());
            }
        }
 
    }
    
    // 通過GET方法獲取信息
    public InputStream getIS (String url){
        
        InputStream is=null;
        
        try{
            // 取得默認HttpClient實例
            HttpClient hc = new DefaultHttpClient();
            // 連接到服務器
            HttpResponse hr = hc.execute(new HttpGet(url));
            // 獲取數據內容
            is = hr.getEntity().getContent();            
        }catch (Exception e){
            e.printStackTrace();
            sendMessage(Var.msg_error,e.toString());
        }
        
        return is;
        
    }
    
    // 發送消息(用於更新UI)
    public void sendMessage(int x, String s){
        
        msg = new Message();
        bdl = new Bundle();    
        bdl.putString("1",s);
        msg.what = x;
        msg.setData(bdl);    
        MainActivity.mainHandler.sendMessage(msg);
        
    }    

}

使用HttpClient向服務器發出請求,服務器返回的是一個InputStream,調用Util里面的函數將InputStream轉換成StringBuilder,獲得JSON字符串,再解析JSON字符串,獲得數據。

5. MainActivity.java:

package com.hzhi.school;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.hzhi.school.comm.CommThread;
import com.hzhi.school.util.Var;

public class MainActivity extends ListActivity{
    
    static list_clas_adaptor myAdaptor;
    static Context mCtx;
    static ProgressDialog progressDialog;
    static Toast toast;
    CommThread myThread;
    static int numGet = 0;
    ListView lv;
    int id;
    item_clas it;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_clas);
        mCtx = getApplicationContext();        
        getScreen();        
        myAdaptor = new list_clas_adaptor(this);
        progressDialog = ProgressDialog.show(MainActivity.this, 
                "連接", "正在連接服務器:" + Var.strURL, true, false);
        setListAdapter(myAdaptor);
        
        myThread = new CommThread();
        myThread.start();        
    }
    
    protected void onListItemClick(ListView l, View v, int position, long id) {  
        id = Integer.parseInt((String) myAdaptor.list_data.get(position).txtNum.getText());        
        it = (item_clas) myAdaptor.getItem((int)id);
super.onListItemClick(l, v, position, id);  
    }  
    
    // 獲得課程列表
    public static void getData(){    
        myAdaptor.list_data.clear();
        if (Var.lstId.size()>0){    
            for (int i=0; i<Var.lstId.size(); i++){
                myAdaptor.addItem(Var.lstId.get(i).toString(), 
                        Var.lstName.get(i).toString(), Var.lstComm.get(i).toString(), 1);

            }
        }
        numGet++;
    }
    
    // 消息處理Handler
    public static Handler mainHandler = new Handler() {  
        public void handleMessage(Message msg) {   
             switch (msg.what) 
             {   
                 
                 // 出錯
                 case  Var.msg_error:
                     toast = Toast.makeText(mCtx, 
                            "錯誤:" + msg.getData().getString("1"), Toast.LENGTH_LONG);
                     toast.show();
                     break;
                 // 已連接成功
                 case Var.msg_connect:
                     progressDialog.dismiss();
                     getData();
                     myAdaptor.notifyDataSetChanged();
                     toast = Toast.makeText(mCtx, 
                             "連接服務器並返回數據成功!", Toast.LENGTH_LONG);
                      toast.show();
                     break;
                 
             }   
             super.handleMessage(msg);   
        }   
   };
    
    
    // 獲得屏幕尺寸
    public void getScreen(){        
        Var.wid_scr = getWindowManager().getDefaultDisplay().getWidth();
        Var.hei_scr = getWindowManager().getDefaultDisplay().getHeight();        
    }
    
}

//課程列表
class list_clas_adaptor extends BaseAdapter implements OnClickListener{
    
    public Context ctx;
    public List<item_clas> list_data;
    public String s1, s2;

    public list_clas_adaptor(Context context){        
        ctx =context;
        list_data = new ArrayList<item_clas>();        
    }
    
    
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list_data.size();
    }

    @Override
    public Object getItem(int id) {
        // TODO Auto-generated method stub 
        s2 = String.valueOf(id);
        for (int i=0; i<list_data.size(); i++){
            s1 = (String) list_data.get(i).txtNum.getText();
            if (s1.equals(s2))
                return list_data.get(i);
        }
        
        return null;
        
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return list_data.indexOf(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        item_clas my_item; 
    if (convertView == null) 
        {  
            my_item = new item_clas(ctx,
              (String)list_data.get(position).txtNum.getText(),
              (String)list_data.get(position).txtName.getText(),
              (String)list_data.get(position).txtComm.getText()
              ,1); 
        }
        else
        {  
            my_item = (item_clas)convertView;  
            my_item.txtNum.setText(list_data.get(position).txtNum.getText());
            my_item.txtName.setText(list_data.get(position).txtName.getText());
            my_item.txtComm.setText(list_data.get(position).txtComm.getText());
        }
        
        // 點擊刪除按鈕
        my_item.btnDel.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                
                
            }        });
        
        // 點擊修改按鈕
        my_item.btnMdf.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                
                
            }
});
return my_item; } public void addItem(String num, String name, String comm, int x) { list_data.add(new item_clas(ctx, num, name, comm, x)); } @Override public void onClick(View v) { } } // clas列表的一行 class item_clas extends LinearLayout{ public TextView txtNum; public TextView txtName; public TextView txtComm; public TextView txtMdf; public TextView txtDel; public Button btnMdf; public Button btnDel; public item_clas(Context ctx, String num, String name, String comm, int x) { super(ctx); this.setOrientation(HORIZONTAL); int hei = 60; txtNum = new TextView(ctx); txtNum.setText(num); txtNum.setGravity(Gravity.CENTER); txtNum.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD); addView(txtNum, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.1),hei)); txtName = new TextView(ctx); txtName.setText(name); txtName.setGravity(Gravity.CENTER); txtName.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD); addView(txtName, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.2),hei)); txtComm = new TextView(ctx); txtComm.setText(comm); Gravity g = new Gravity(); txtComm.setGravity(Gravity.LEFT); addView(txtComm, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.4),hei)); if (x==0){ txtDel = new TextView(ctx); txtDel.setText("刪除"); txtDel.setGravity(Gravity.CENTER); addView(txtDel, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei)); Log.i("addView", txtDel.getText().toString()); txtMdf = new TextView(ctx); txtMdf.setText("更新 "); txtMdf.setGravity(Gravity.CENTER); addView(txtMdf, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei)); Log.i("comm=", comm); Log.i("addView", txtMdf.getText().toString()); } else{ btnDel = new Button(ctx); btnDel.setText("刪除"); btnDel.setGravity(Gravity.CENTER); btnDel.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD); btnDel.setFocusable(false); addView(btnDel, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei)); btnMdf = new Button(ctx); btnMdf.setText("更新"); btnMdf.setGravity(Gravity.CENTER); btnMdf.setTypeface(Typeface.DEFAULT_BOLD, Typeface.BOLD); btnMdf.setFocusable(false); addView(btnMdf, new LinearLayout.LayoutParams((int)(Var.wid_scr*0.15),hei)); } } }

MainActivity調用CommThread訪問服務器,獲得數據后通過BaseAdaptor顯示出來。在item_clas類中,由於點擊每一行會被系統誤以為是在點擊Button,所以要給Button加上:

setFocusable(false);

 

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM