1

PHPを使用してmysqlに接続する際のチュートリアルを使用して、URLからデータを取得しようとしています。

ただし、コードを実行すると nullpointerexception が発生します。

Database_demo.java

 package com.database_demo;

 import java.io.BufferedReader;
 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.HttpClient;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;

 import android.app.ListActivity;
 import android.net.ParseException;
 import android.os.Bundle;
 import android.widget.ArrayAdapter;
 import android.widget.Toast;

 public class Database_demo extends ListActivity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    String result = null;
    InputStream is = null;
    StringBuilder sb = null;
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    List<String> r = new ArrayList<String>();

    try{

    //http post
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://uragon-dev.com/synergy/webservices.php?action=displayAll");
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
    }
    catch(Exception e){
        Toast.makeText(getBaseContext(),e.toString() ,Toast.LENGTH_LONG).show();
   }

    //Convert response to string  
    try
    {
      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));

      sb = new StringBuilder();

      String line = null;

      while ((line = reader.readLine()) != null) 
      {
         sb.append(line + "\n");
      }

      is.close();

      result = sb.toString();
    }
    catch(Exception e)
    {
        Toast.makeText(getBaseContext(),e.toString() ,Toast.LENGTH_LONG).show();
    }
    //END Convert response to string   
    try{
            JSONArray jArray = new JSONArray(result);
            JSONObject json_data=null;
            for(int i=0;i<jArray.length();i++)
            {
               json_data = jArray.getJSONObject(i);
               r.add(json_data.getString("users"));
           }
           setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, r));
        }
        catch(JSONException e1){
            Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
        } catch (ParseException e1) {
            Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
    }

}
 }

logcat のエラーは、この行を指しています。

 try{
            JSONArray jArray = new JSONArray(result);

URL http://uragon-dev.com/synergy/webservices.php?action=displayAllで取得するデータは次のとおりです。

{"users":[{"username":"jokerxvier","firstname":"jason","lastname":"javier"},{"username":"migz","firstname":"miguel","lastname":"rivera"}],"success":1}

これを引き起こしている問題は何ですか?また、URLからデータを取得するだけでなく、URLにデータを渡す方法を知りたいです。アンドロイド初心者です。ありがとう!

4

3 に答える 3

0

あなたはエラーがにあると言いましたJSONArray jArray = new JSONArray(result);。この場合、 の値を確認していただけますresultか? LogLogcatに表示するために使用するかもしれません。

エラーがNetworkOnMainThreadの場合は、@ user2045570 からの回答を確認する必要があります。

これが役に立てば幸いです、頑張ってください

リード

于 2013-09-25T03:17:54.240 に答える
0

メインスレッドでネットワーク操作を試みているようです。これを処理する方法については、この投稿をご覧ください: https://stackoverflow.com/a/6343299/2045570

ドキュメントを読む

編集:

JSON エラーが発生する理由は、最初の例外をキャッチしているためです。

    try{

    //http post
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://uragon-dev.com/synergy/webservices.php?action=displayAll");
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
    }
    catch(Exception e){
        Toast.makeText(getBaseContext(),e.toString() ,Toast.LENGTH_LONG).show();

   }

だからここに:

JSONArray jArray = new JSONArray(result);

result常に null になります。これは、解決する必要がある最初の問題です。メインスレッドからネットワークにアクセスできません。

エラー メッセージを確認するe.printStackTrace();には、catch ブロックに: という行を追加するandroid.os.NetworkOnMainThreadExceptionと、logcat 出力に a が出力されます。

于 2013-09-25T03:11:31.440 に答える