PHP と JSON を使用して MySQL データベースから気象データを取得するアプリケーションを開発しています。ユーザーがインターネットに接続しているかどうかを確認し、そうでない場合は、ローカルに保存されているファイルを探します。そのファイルが存在しない場合は、メッセージが表示されます。リストを更新するには、ユーザーはアプリケーションを再起動する必要があります。これはあまりユーザーフレンドリーではないことがわかったので、データを更新するボタンを追加することにしました。
ListActivity クラス (以下のコードでは WeerActivity.java と呼ばれます) と、新しいスレッドでインターネットからすべてのデータを収集するクラス (InternetWeerThread.java と呼ばれます) の 2 つのクラスがあります。更新ボタン用の onClickListener は、ListActivity クラスに設定されています。これは、更新コードを含むランナブルを他のクラスに投稿しようとします。しかし、私がこれを行うとき。コードがまだ UI スレッドで実行されているため、例外が発生します。
WeerActivity.java
public class WeerActivity extends ListActivity{
private static Thread internetWeerThread;
private InternetWeerThread internetWeerThreadInstance;
public static Handler activityHandler;
public static Handler internetHandler;
public static ListView listView;
public static Context context;
public static LinearLayout weerContainer;
public static Button refreshButton;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.weer);
refreshButton = (Button) findViewById(R.id.weer_refresh_button);
listView = (ListView)findViewById(android.R.id.list);
weerContainer = (LinearLayout) findViewById(R.id.weer_container);
context = this;
activityHandler = new Handler();
internetWeerThreadInstance = new InternetWeerThread(activityHandler);
internetWeerThread = internetWeerThreadInstance;
internetHandler = InternetWeerThread.getHandler();
internetWeerThread.start();
refreshButton.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
internetHandler.post(internetWeerThreadInstance.new Refresh());
}
});
}
}
InternetWeerThread.java
class InternetWeerThread extends Thread{
private Handler activityHandler;
private static String html;
private static JSONArray weerItems;
private static ArrayList<WeerData> weerData = new ArrayList<WeerData>();
private static WeerAdapter adapter;
private static String JSONString;
private static final String timeoutString = "Unable to connect with the server, check your internet connection";
private static final Handler internetWeerThread = new Handler();
// CONSTRUCTOR
public InternetWeerThread(Handler activityHandler){
this.activityHandler = activityHandler;
}
public static Handler getHandler(){
return internetWeerThread;
}
@Override
public void run(){
onRefresh();
}
// method that gets called by the Runnable Refresh (and onCreate)
private void onRefresh(){
try{
weerItems = getWeerItems("http://192.168.178.14/weer.php");
JSONString = weerItems.toString();
FileAccess.createFile(WeerActivity.context, "weer.txt", JSONString);
displayData(weerItems);
}catch(IOException e){
e.printStackTrace();
System.out.println(WeerActivity.context);
if(FileAccess.fileExists(WeerActivity.context, "weer.txt")){ // read data from file
JSONArray JSONData;
try {
if(FileAccess.readFile(WeerActivity.context, "weer.txt") != null){
JSONData = new JSONArray(FileAccess.readFile(WeerActivity.context, "weer.txt"));
displayData(JSONData);
activityHandler.post(new Updater());
}else{
activityHandler.post(new TimeOut());
}
} catch (JSONException je) {
je.printStackTrace();
activityHandler.post(new TimeOut());
}
}else{ // display message that there is no internet connection and no file present
activityHandler.post(new TimeOut());
}
}
}
private JSONArray getWeerItems(String link) throws IOException{
HttpUriRequest request = new HttpGet(link.toString());
BasicHttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 3000;
ConnManagerParams.setTimeout(httpParameters, timeoutConnection);
HttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse response = httpClient.execute(request);
if(response.getStatusLine().getStatusCode() == 200){
JSONArray jArray = new JSONArray();
try {
URL url = new URL(link);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
readStream(con.getInputStream());
try {
jArray = new JSONArray(html);
} catch (JSONException e) {
e.printStackTrace();
}
return jArray;
}catch (Exception e) {
e.printStackTrace();
}
return jArray;
}else{
activityHandler.post(new TimeOut());
JSONArray jArray = new JSONArray();
return jArray;
}
}
private void readStream(InputStream in){
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
html = "";
while ((line = reader.readLine()) != null) {
html += line;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void displayData(JSONArray jArray){
try{
int length;
if(jArray.length() < 7){
length = jArray.length();
}else if (jArray.length() > 7){
length = 7;
}else{
length = 7;
}
for(int i = 0; i < length; i++){
JSONObject row = jArray.getJSONObject(i);
int temperatureDay = row.getInt("temperature_day");
int temperatureNight = row.getInt("temperature_night");
String date = row.getString("date");
int weatherType = row.getInt("weather_type");
WeerData singleWeerData = new WeerData();
singleWeerData.setTemperatureDay(temperatureDay);
singleWeerData.setTemperatureNight(temperatureNight);
singleWeerData.setDate(date);
singleWeerData.setWeatherType(weatherType);
weerData.add(i, singleWeerData);
}
activityHandler.post(new Updater());
}catch(JSONException e){
e.printStackTrace();
}
}
// update the listView
public class Updater implements Runnable{
public void run(){
adapter = new WeerAdapter(WeerActivity.context, R.layout.weer_row, weerData);
WeerActivity.listView.setAdapter(adapter);
}
}
スレッドとランナブルは初めてです。これは私が作成している最初の Android アプリケーションです。うまくいけば、誰かがこの問題を解決するのを手伝ってくれるでしょう。
どんな助けでも大歓迎です!