|
|
|
มีปัญหา android ดึงข้อมูลจาก server ไม่ได้ ลองทำ connect server backgroud ตามเว็บบอร์ดครับ |
|
|
|
|
|
|
|
ตามโคดครับ ถ้ามันดึงข้อมูลไม่ได้ ผมกำหนดให้มันแสดง"เกิดข้อผิดพลาดในการดึงข้อมูล" สงสัยมันส่งและรับค่า ไม่ได้ ท่านใด เคยเจอปัญหาเหมือนผม ช่วยด้วยนะครับ ผมทำตามกะทู้นี้ครับ http://www.androidcode.in.th/2012/?p=383 ลองก็อบโคดมาทำ ยังไม่ได้ดัดแปลงอะไร ก้อรันไม่ผ่านเฉยเลย ขอบคุณนะครับเป็นกรณีศึกษาครับ
ไฟล์ json
Code (PHP)
<?php
$host = "localhost";
$user = "user";
$pass = "pass";
$db = "db_name";
mysql_connect($host,$user,$pass);
mysql_query("SET NAMES UTF8");
mysql_query("USE $db");
$age = $_REQUEST['age'];
$sql = "SELECT * FROM sample_connect_server WHERE age='$age'";
$result = mysql_query($sql);
if($result){
while($row = mysql_fetch_array($result))
$data[] = $row;
$json = array('status' => "OK",'result' => $data);
}else{
$json = array('status' => "ERROR");
}
print(json_encode($json));
mysql_close();
?>
ฐานข้อมูล
Code (SQL)
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
CREATE TABLE IF NOT EXISTS `sample_connect_server` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
INSERT INTO `sample_connect_server` (`id`, `name`, `age`) VALUES
(1, 'PETDO', 20),
(2, 'AAA', 20);
mainactivity.java
Code (Android-Java)
package th.in.androidcode.connectserverbackground;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView listView;
private ArrayList<String> list;
private ArrayAdapter<String> arrayAdapter;
private ConnectServer connectServer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//เชื่อม listView กับ View
listView = (ListView)findViewById(R.id.listView);
//สร้างตัวเชื่อมต่อกับ Server ไปที่ URL ที่กำหนด
connectServer = new ConnectServer(this, "http://www.newsrealtionsthailand.com/android/connect_server.php");
//เพิ่มการส่งค่า age มีค่า 20 แบบ post
connectServer.addValue("age","20");
//เชื่อมต่อกับ Server
connectServer.execute();
}
//ถ้าดึงข้อมูลจาก Server เสร็จแล้ว จะมาทำงานที่ Function นี้
public void setList(ArrayList<String> list){
this.list = list;
arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, this.list);
listView.setAdapter(arrayAdapter);
}
//ถ้าไม่สามารถเชื่อมต่อกับ Server ได้จะมาทำงานที่ Function นี้
public void cannotConnectToServer() {
Toast.makeText(this, "ไม่สามารถเชื่อมต่อกับ Server", Toast.LENGTH_LONG).show();
}
//ถ้าดึงข้อมูลจาก Server มีปัญหา จะมาทำงานที่ Function นี้
public void errorConnectToServer() {
Toast.makeText(this, "เกิดขอผิดพลาดในการดึงข้อมูล", Toast.LENGTH_LONG).show();
}
}
connectserver.java
Code (Android-Java)
package th.in.androidcode.connectserverbackground;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
public class ConnectServer extends AsyncTask<String, Integer, String>{
private HttpPost httppost;
private HttpClient httpclient;
private List<NameValuePair> nameValuePairs;
private DialogConnect dialogConnect;
private Context context;
ConnectServer(Context context,String URL){
this.context = context;
//สร้างส่วนประกอบที่จำเป็นในการเชื่อมกับ Server
this.httpclient = new DefaultHttpClient();
this.httppost = new HttpPost(URL);
this.nameValuePairs = new ArrayList<NameValuePair>();
//สร้าง Dialog ตอนเชื่อมต่อกับ Server
//มีการส่ง ConnectServer ให้กับ Dialog เพื่อใช้ในการยกเลิก
dialogConnect = new DialogConnect(this.context, this);
dialogConnect.setTitle(this.context.getString(R.string.app_name));
dialogConnect.setMessage("กรุณารอสักครู่");
}
//Function สำหรับเพิ่มตัวแปรในการส่งค่าแบบ Post
public void addValue(String key,String value){
nameValuePairs.add(new BasicNameValuePair(key, value));
}
//ก่อนที่จะทำ doInBackground จะทำงานที่ Function นี้ก่อน
protected void onPreExecute() {
dialogConnect.show();
}
//เริ่มทำงานแบบ Background
protected String doInBackground(String... params) {
InputStream is = null;
String result = null;
//เริ่มการเชื่อมต่กับ Server
try {
//ทำการส่งตัวแปรต่างๆ ในรูปแบบของ UTF-8
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
//อ่านผลลัพธ์ในรูปแบบของ UTF-8
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
//ถ้าขณะเชื่อมต่อกับ Server มีปัญหา จะแสดง Log Error
} catch (ClientProtocolException e) {
Log.e("ConnectServer", e.toString());
} catch (IOException e) {
Log.e("ConnectServer", e.toString());
}
return result;
}
//ถ้าทำงานที่ doInBackground เสร็จแล้ว จะมาทำงานที่ Function นี้
protected void onPostExecute(String result) {
//list ที่ใช้เก็บข้อมูล
ArrayList<String> list = new ArrayList<String>();
//ถ้า result เป็น null คือ ไม่สามารถเชื่อมต่อกับ server ได้
//ถ้าเชื่อมต่กับ server ได้ จะทำงานต่อไปนี้
if(result != null){
//เริ่มการแปลง JSON เป็นข้อมูล
try {
//แปลงผลลัพธ์ที่ได้มาเป็น JSON Object
JSONObject jObject = new JSONObject(result);
//ถ้าถึงข้อมูลจาก database ได้จะมีผลลัพธ์ status กลับมาว่า OK
if(jObject.getString("status").equals("OK")){
//แปลงผลลัพธ์ที่ได้มาเป็น JSON Array
JSONArray jResult = jObject.getJSONArray("result");
//ดึงขนาดของข้อมูลใน jResult
int size = jResult.length();
//วน Loop เอาค่าใส่ใน List
for(int i=0;i<size;i++){
String data = "ID : "+ jResult.getJSONObject(i).getString("id") + "\n"
+ "Name : " + jResult.getJSONObject(i).getString("name") + "\n"
+ "Age : " + jResult.getJSONObject(i).getString("age");
list.add(data);
}
//ถ้าดึงข้อมูลจาก database มีปัญหาจะแสดง error
}else{
((MainActivity)context).errorConnectToServer();
}
((MainActivity)context).setList(list);
//ถ้าขณะแปลงข้อมูล JSON มีปัญหาจะมาทำงานส่วนนี้
} catch (JSONException e) {
Log.e("ConnectServer", "Error parsing data " + e.toString());
((MainActivity)context).errorConnectToServer();
}
//ถ้าเชื่อมต่อกับ server ไม่ได้จะทำงานต่อไปนี้
}else{
((MainActivity)context).cannotConnectToServer();
}
dialogConnect.dismiss();
}
}
Tag : Mobile, MySQL, Android
|
|
|
|
|
|
Date :
2013-02-21 21:30:26 |
By :
plomplam.2 |
View :
1870 |
Reply :
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลองดูตัวนี้ครับ
Android Edit/Update Data to Web Server Database (Web Server)
|
|
|
|
|
Date :
2013-02-22 06:40:17 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
รันผ่านแล้วครับ ตอนแรกกำหนดให้มันรับค่า จาก emulator ความจริงต้องกำหนด host ของเครื่องโดยตรง ขอบคุณครับ
|
|
|
|
|
Date :
2013-02-22 11:35:15 |
By :
plomplam.2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ดีใจด้วยครับ
|
|
|
|
|
Date :
2013-02-22 12:12:14 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 05
|