ICS Eclipse - 无法从PHP获取信息

时间:2012-02-19 21:33:21

标签: android eclipse sdk

我构建了一个应用程序,它从连接到MySql服务器的php文件获取内容。它适用于最高4.0的每台设备(基于反馈) 运行我的应用程序ICS时,它会出现解析错误或无法显示列出的项目。为什么是这样? 这是代码,我从我的数据库中获取内容,使用PHP文件:

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();
        }
}

由于

1 个答案:

答案 0 :(得分:0)

Android将在API等级NetworkOnMainThreadException(Android 3.0)及更高版本上投放11。正如其名称所示,您不能在主线程上打开网络连接。

原因是“Designing for Responsiveness”。如果您的服务器不可用或用户处于弱连接状态,则您的应用程序会滞后,因为它正在等待服务器响应。

要获得一些帮助,您可以阅读:http://saigeethamn.blogspot.com/2010/05/http-connection-using-threads-handlers.html