이 기사에서는 주로 PHP 배경을 기반으로 한 Android 뉴스 검색 클라이언트를 자세히 소개합니다. 이는 특정 참조 가치가 있으며 관심 있는 친구들이 참조할 수 있습니다. 그것이 모두에게 도움이 되기를 바랍니다.
구체적인 내용은 다음과 같습니다
1. HBuilder를 사용하여 PHP 환경을 구성하고 MySQL 문을 쿼리할 수 있는지 테스트합니다.
2. 여기서 PHP 배경은 mysql의 쿼리 기능을 구현하고 JSON 데이터 형식으로 클라이언트를 반환합니다.
여기에서 PHP에서 mysql_connect.php 파일을 생성하여 데이터베이스 연결을 구현하고 문자 집합 형식을 설정합니다.
<?php $con = mysql_connect("localhost","root","123456"); //设置字符集为UTF-8 可解决中文乱码 mysql_query("SET NAMES 'utf8'"); mysql_query("SET CHARACTER SET utf8"); mysql_query("SET CHARACTER_SET_RESULT=utf8"); if(!$con){ die(mysql_error()); } mysql_select_db("newsdemo",$con); ?>
그런 다음 새 getNewsJSON.php 파일을 생성하여 쿼리 결과를 JSON 문자열 형식으로 변환합니다. json_encode 메서드만 필요합니다.
<?php /*获得JSON数据 * 返回值:title desc time content_url pic_url*/ require 'mysql_connect.php'; $n = 0; $result = mysql_query("select * from news"); while($row = mysql_fetch_array($result)){ $arr[$n++] = array( "title"=>$row['title'], "desc"=>$row['desc'], "time"=>$row['time'], "content_url"=>$row['content_url'], "pic_url"=>$row['pic_url'] ); } //数组转化为JSON字符串 echo json_encode($arr); ?>
안드로이드 쪽 디자인과 개발에 중점을 둡니다
1. 인터페이스 디자인
ListView의 각 항목에 동일한 형식을 설정해야 하므로 여기서는 ListView+Adapter 형식을 사용합니다
메인 인터페이스 ListView 컨트롤에 LinearLayout을 추가합니다.
2. Mainactivity 프로그램은 다음과 같습니다.
public class MainActivity extends Activity implements OnItemClickListener{ private ListView lvNews ; private NewsAdapter adapter ; //定义集合 private List<News> newsList ; //获取json字符串的URL地址 public static final String GET_NEWS_URL = "http://211.87.234.20/NewsDemo/getNewsJSON.php"; //获取msg之后如何处理 private Handler getNewsHandler = new Handler(){ public void handleMessage(android.os.Message msg){ String jsonData = (String) msg.obj ; System.out.println(jsonData) ; try { JSONArray jsonArray = new JSONArray(jsonData) ; for(int i=0;i<jsonArray.length();i++){ JSONObject object = jsonArray.getJSONObject(i) ; String title = object.getString("title") ; String desc = object.getString("desc") ; String time = object.getString("time") ; String content_url = object.getString("content_url") ; String pic_url = object.getString("pic_url") ; System.out.println("title="+title) ; //add一个News类型的Object newsList.add(new News(title,desc,time,content_url,pic_url)) ; } //通知更新 adapter.notifyDataSetChanged() ; } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ; } ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) ; setContentView(R.layout.activity_main) ; lvNews = (ListView) findViewById(R.id.lvNews) ; //初始化 newsList = new ArrayList<News>(); adapter = new NewsAdapter(this,newsList) ; lvNews.setAdapter(adapter) ; lvNews.setOnItemClickListener(this) ; HttpUtils.getNewsJSON(GET_NEWS_URL,getNewsHandler) ; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub News news = newsList.get(position) ; Intent intent = new Intent(this,BrowseNewsActivity.class) ; intent.putExtra("content_url",news.getContent_url()) ; startActivity(intent) ; } }
여기서 항목의 뷰 표시를 실현하려면 도구 클래스 HttpUtils와 사용자 정의 NewsAdapter가 필요합니다.
package com.MR.news.utils; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; import android.widget.ImageView; public class HttpUtils { //工具类直接定义成静态方法即可 /*url用于内部类中,所以要将其设定为final类型*/ /*读取完成需要通知主线程,需要使用handler*/ public static void getNewsJSON(final String url,final Handler handler){ //访问网络,时间长,开启新线程 new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub HttpURLConnection conn ; InputStream is ; try { conn = (HttpURLConnection) new URL(url).openConnection() ; //GET方式获取 conn.setRequestMethod("GET") ; //得到输入流 is=conn.getInputStream() ; //读取数据用缓冲,里面要传入一个reader BufferedReader reader = new BufferedReader(new InputStreamReader(is)); //一行一行读取数据 String line = ""; //没读完一行进行拼接,高效 StringBuilder result = new StringBuilder(); while((line = reader.readLine()) != null){ result.append(line); } Message msg = new Message() ; //msg.obj可以放进去任何对象 msg.obj = result.toString() ; handler.sendMessage(msg) ; } catch (Exception e) { e.printStackTrace(); } }}).start() ; } public static void setPicBitMap(final ImageView ivPic,final String pic_url){ new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub try { HttpURLConnection conn = (HttpURLConnection) new URL(pic_url).openConnection() ; conn.connect() ; InputStream is = conn.getInputStream() ; //bitmap就是所需图片资源 /*从资源文件中的到图片*/ Bitmap bitmap = BitmapFactory.decodeStream(is) ; ivPic.setImageBitmap(bitmap) ; is.close() ; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start() ; } }
NewsAdapter 코드는 다음과 같습니다.
package com.MR.news.adapter; import java.util.List; import com.MR.news.R; import com.MR.news.model.News; import com.MR.news.utils.HttpUtils; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class NewsAdapter extends BaseAdapter { //声明上下文对象,后面的getView方法需要 private Context context; private List<News> newsList; public NewsAdapter(Context context, List<News> newsList){ this.context = context ; this.newsList = newsList ; } @Override public int getCount() { // TODO Auto-generated method stub return newsList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return newsList.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup arg2) { // TODO Auto-generated method stub if(convertView == null){ convertView = LayoutInflater.from(context).inflate(R.layout.news_item,null) ; } TextView tvTitle = (TextView) convertView.findViewById(R.id.tvTitle) ; TextView tvDesc = (TextView) convertView.findViewById(R.id.tvDesc) ; TextView tvTime = (TextView) convertView.findViewById(R.id.tvTime) ; ImageView ivPic = (ImageView) convertView.findViewById(R.id.ivPic); News news = newsList.get(position) ; tvTitle.setText(news.getTitle()) ; tvDesc.setText(news.getDesc()) ; tvTime.setText(news.getTime()) ; String pic_url = news.getPic_url() ; HttpUtils.setPicBitMap(ivPic, pic_url) ; return convertView; } }
news_item 각 항목의 표시 형식을 설정하려면
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/ivPic" android:layout_width="42dp" android:layout_height="42dp" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/ivPic" android:text="title" android:textSize="18sp" /> <TextView android:id="@+id/tvDesc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/tvTitle" android:layout_below="@+id/tvTitle" android:text="desc" android:textSize="18sp" /> <TextView android:id="@+id/tvTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="time" android:textSize="10sp" /> </RelativeLayout>
참고: 이 항목은 단일 이미지를 표시해야 하므로 Bitmap 클래스가 사용됩니다. 네트워크 전송을 사용하므로 스레드 개념을 사용해야 합니다! !
핵심은 핸들러 메시지와 루프 사이의 관계를 이해하는 것입니다.
관련 권장사항:
PHP API를 사용하여 일기예보를 받고 Fetion API를 사용하여 친구에게_PHP 튜토리얼 보내기Newbie php API 첫 경험 php api 문서 php api 인터페이스 개발 php web apnginx ajax 크로스 구성 -PHP API위 내용은 PHP 백엔드를 기반으로 Android 클라이언트 뉴스 검색 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!