i build an app which get’s content from a php file which connects to a MySql server. It works on every device (based on feedback) up to 4.0
When running my app ICS, it gets an parse error or cant show the items listed. Why is this?
This is the code, where i get the content from my DB, using a PHP file:
package com.fireplace.software;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
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 org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
public class GetContentFromDBActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listofapps);
LoadData();
}
void GenData(){
ArrayList<ItemSkel> list = new ArrayList<ItemSkel>();
for(int i = 0; i< 10; ++i) {
list.add(new ItemSkel("id " + i, "label " + i, "path " + i, "description " + i, "ptype " + i));
}
Gson gson = new Gson();
String json = gson.toJson(list);
Toast.makeText(GetContentFromDBActivity.this, json, Toast.LENGTH_LONG).show();
}
public void btnLoadData(View v) {
LoadData();
}
void LoadData(){
//TextView v = (TextView)findViewById(R.id.txtStatusError);
try {
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.u2worlds.com/fp/getdata.php");
HttpResponse response = httpClient.execute(httpGet, localContext);
String result = "";
BufferedReader reader = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent()
)
);
String line = null;
while ((line = reader.readLine()) != null)
result += line;
Type type = new TypeToken<ArrayList<ItemSkel>>(){}.getType();
Gson g = new Gson();
final ArrayList<ItemSkel> list = g.fromJson(result, type);
ArrayList<String> stringArray = new ArrayList<String>();
for (ItemSkel item : list)
stringArray.add("" + item.getLabel());
ArrayAdapter<String> modeAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, stringArray);
ListView lv = (ListView)findViewById(R.id.lwApps);
lv.setAdapter(modeAdapter);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
ItemSkel currentItem = list.get(position);
Intent i = new Intent(getApplicationContext(), ViewInfoActivity.class);
i.putExtra("title", currentItem.getLabel());
i.putExtra("icon", currentItem.getIcon());
i.putExtra("link", currentItem.getPath());
i.putExtra("desc", currentItem.getDescription());
i.putExtra("ptype", currentItem.getPtype());
startActivity(i);
}
});
//Toast.makeText(GetContentFromDBActivity.this, "No Error", Toast.LENGTH_LONG).show();
}
catch (Exception ex) {
//v.setText(ex.getMessage());
Toast.makeText(GetContentFromDBActivity.this, "Could not connect!", Toast.LENGTH_LONG).show();
}
}
public void updateProgress(int currentSize, int totalSize){
//Toast.makeText(this, "Packages: " + Long.toString((currentSize/totalSize)*100)+"% Complete", Toast.LENGTH_SHORT).show();
}
}
Thanks
Android will throw a NetworkOnMainThreadException on API Level 11 (Android 3.0) and above. As its name says, you must not open a network connection on the main thread.
The reason for this is the principle “Designing for Responsiveness“. If your server is not available or the user is on a weak connection, your app lags because it’s waiting for a server response.
To get some help on this, you can read this: http://saigeethamn.blogspot.com/2010/05/http-connection-using-threads-handlers.html