PHP 배경 기반 Android 뉴스 탐색 클 라 이언 트
1.HBuilder 를 사용 하여 PHP 환경 설정 을 하고 MySQL 문 구 를 조회 할 수 있 는 지 테스트 합 니 다.전에 상세 하 게 설 명 했 습 니 다.
2.phop 배경 에서 my sql 조회 기능 을 실현 하고 JSON 데이터 형식 으로 클 라 이언 트 를 되 돌려 줍 니 다.
PHP 에 my sql 을 만 듭 니 다.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);
?>
그리고 검색 결 과 를 JSON 문자열 형식 으로 변환 하 는 데 사용 할 getNewsJSON.php 파일 을 새로 만 듭 니 다.jsonencode 라 는 방법 이면 됩 니 다.
<?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 의 모든 Item 에 같은 형식 을 설정 해 야 하기 때문에 ListView+Adapter 형식 을 사용 합 니 다.
주 인터페이스 LinearLayout 에 ListView 컨트롤 추가
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) ;
}
}
item 의 보기 표 시 를 위해 도구 류 HttpUtils 와 사용자 정의 NewsAdapter 가 필요 합 니 다.HttpUtils 코드 는 다음 과 같 습 니 다.
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 은 모든 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 같은 종 류 를 사용 합 니 다.네트워크 전송 을 사용 하기 때문에 스 레 드 라 는 개념 을 사용 해 야 합 니 다!!handler message 와 loop 의 관 계 를 이해 하 는 것 이 관건 입 니 다.
이상 은 본 고의 모든 내용 입 니 다.여러분 이 안 드 로 이 드 소프트웨어 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.