0

以下のコードを使用します。Android 2.3.3 で完全に動作します。ただし、4.0 以降では何らかの理由でデータベースに接続できません。非同期クラスで取得する必要があるという投稿を見ました。私もそれを試しましたが、うまくいかないようです。使い方が悪いのかもしれませんが、わかりにくいです。

 public class connector extends Activity {
    /** Called when the activity is first created. */

       TextView txt;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getServerData(null);
    }
     //i use my real ip here

    public String getServerData(String returnString) {
        System.out.println("going to connector class");
       InputStream is = null;
       final String KEY_121 = "http://10.0.0.128/connector.php";
       String result = "";
        //the year data to send
      //  ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
      //  nameValuePairs.add(new BasicNameValuePair("year","1970"));

        //http post
        try{
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(KEY_121);
               // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();

        }catch(Exception e){
                Log.e("log_tag", "Error in http connection "+e.toString());
        }

        //convert response to string
        try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                }
                is.close();
                result=sb.toString();
        }catch(Exception e){
                Log.e("log_tag", "Error converting result "+e.toString());
        }
        //parse json data
        try{
                JSONArray jArray = new JSONArray(result);
                for(int i=0;i<jArray.length();i++){
                        JSONObject json_data = jArray.getJSONObject(i);
                        Log.i("log_tag","ID: "+json_data.getInt("ID")+
                                ", \nActara: "+json_data.getString("Actara")
                        );
                        //Get an output to the screen
                        returnString += "\n\t" + jArray.getJSONObject(i); 
                }
        }catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());
        }
        return returnString; 
    }    

    }

Logcat エラー (4.0 以降):

11-12 12:02:35.658: E/log_tag(14083): Error in http connection android.os.NetworkOnMainThreadException
11-12 12:02:35.658: E/log_tag(14083): Error converting result java.lang.NullPointerException
11-12 12:02:35.663: E/log_tag(14083): Error parsing data org.json.JSONException: End of input at character 0 of 

最初のエラー行だけが重要です。データベースに接続できないため、nullPointer が返されます (2 番目と 3 番目のエラー)。

これは私が非同期で試したものです:

    public class connector extends Activity {
    /** Called when the activity is first created. */

       TextView txt;
    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    new BackgroundAsyncTask().execute();

}

 public class BackgroundAsyncTask extends
    AsyncTask<Void, Integer, Void> {

        InputStream is = null;
        final String KEY_121 = "http://10.0.0.128/connector.php";
        String result = "";
        String returnString = "";

        protected void onPostExecute(Void result) {

        }

        @Override
        protected void onPreExecute() {
        System.out.println("onPreExecute");
        }

        protected Void doInBackground(String... params) {
             try{
                 System.out.println("background in progress");
                 HttpClient httpclient = new DefaultHttpClient();
                 HttpPost httppost = new HttpPost(KEY_121);
                // httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                 HttpResponse response = httpclient.execute(httppost);
                 HttpEntity entity = response.getEntity();
                 is = entity.getContent();

         }catch(Exception e){
                 Log.e("log_tag", "Error in http connection "+e.toString());
         }

         //convert response to string
         try{
                 BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                 StringBuilder sb = new StringBuilder();
                 String line = null;
                 while ((line = reader.readLine()) != null) {
                         sb.append(line + "\n");
                 }
                 is.close();
                 result=sb.toString();
         }catch(Exception e){
                 Log.e("log_tag", "Error converting result "+e.toString());
         }
         //parse json data
         try{
                 JSONArray jArray = new JSONArray(result);
                 for(int i=0;i<jArray.length();i++){
                         JSONObject json_data = jArray.getJSONObject(i);
                         Log.i("log_tag","ID: "+json_data.getInt("ID")+
                                 ", \nActara: "+json_data.getString("Actara")
                         );
                         //Get an output to the screen
                         returnString += "\n\t" + jArray.getJSONObject(i); 
                 }
         }catch(JSONException e){
                 Log.e("log_tag", "Error parsing data "+e.toString());
         }
        return null;
        }

        protected void onProgressUpdate(Integer... values) {

        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            return null;
        }

    }

}

私を助けることができる誰か?4.0以降で機能しない本当の原因が何であるかはわかりません。
さらに情報が必要な場合は、それを言ってください。投稿します。
コードは少し乱雑になる可能性があります。まだ適切に「クリーンアップ」していません。

4

4 に答える 4

2

Android 3.0 以降、メインスレッドでネットワーク処理を行うことは許可されていません。なんで?ネットワークの問題により、UI が遅くなるためです。したがって、新しいスレッドですべての http を実行する必要があります。あなたは正しい道を進んでいますが、AsyncTask で間違いを犯しました。非同期タスクで空の doInBackground メソッドを削除し、メソッドに @Override を書き込みます。

于 2012-11-12T11:34:21.893 に答える
1

わかりました...数時間検索してこの質問をした後、10分後に解決策を見つけます...

オプション1:
次の行を追加しました:

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
 StrictMode.setThreadPolicy(policy);

ただし、オプション1は使用しないことをお勧めします。これは、実際には悪い解決策です。オプション2を使用してください!
// ================================================ ===========================
オプション2:

このチュートリアルを使用して、適切なASyncTaskを作成しました:http://www.elvenware.com/charlie/development/android/SimpleHttpGetThread.html

// ================================================ ===========================
最終的にASyncTaskを使用しました(オプション2)。

于 2012-11-12T11:26:05.530 に答える
1

android.os.NetworkOnMainThreadException

このエラーは HoneyComb (3.0 以降) に付属しています。ドキュメントにあるように、メインスレッドでネットワーク操作を実行することはできません。これに乗るには、ハンドラーまたは asynctask を使用する必要があります。AFAIKそれを行う別の方法はありません。

詳細については、これを参照してください。ICS がアプリをクラッシュさせる理由

以下のコード スニペットを使用してみてください

new Thread(){
    public void run(){
        //do your Code Here    
    }
}.start();
于 2012-11-12T11:42:58.457 に答える
0

なぜあなたはnullWeb接続とWebサービスの機能を渡しているのですか?

getServerData(null);
于 2012-11-12T11:14:46.307 に答える