-2
04-02 21:59:03.086: E/log_tag(27382): Error in http connection android.os.NetworkOnMainThreadException
04-02 21:59:03.106: E/log_tag(27382): Error converting result java.lang.NullPointerException
04-02 21:59:03.106: E/log_tag(27382): Error parsing data org.json.JSONException: End of input at character 0 of 

次のコードから:

package net.example.glutefree;

import android.app.Activity;
import android.os.Bundle;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

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.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.TextView;

public class Networking extends Activity {
    TextView txt;
    int request_Code = 1;
//called when activity is first created
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_networking);
         // Create a crude view - this should really be set via the layout resources 
        // but since its an example saves declaring them in the XML. 
        LinearLayout rootLayout = new LinearLayout(getApplicationContext()); 
        txt = new TextView(getApplicationContext()); 
        rootLayout.addView(txt); 
        setContentView(rootLayout); 
        // Set the text and call the connect function. 
        txt.setText("Connecting...");
      //call the method to run the data retreival
        txt.setText(getServerData(KEY_121));
    }

    public static final String KEY_121 = "http://WEBSITE/application_query.php";

    private String getServerData(String returnString) {
       String UPC = getIntent().getStringExtra("UPCA");
       InputStream is = null;
       String result = "";
        //the upc data to send
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

        nameValuePairs.add(new BasicNameValuePair("UPCA",UPC));

        //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);
                Log.e("log_tag", "Result "+result.toString()); 
                for(int i=0;i<jArray.length();i++) {
                        JSONObject json_data = jArray.getJSONObject(i);
                        Log.i("log_tag","UPCA: "+json_data.getString("UPCA")+
                                ", Product: "+json_data.getString("Product"));
                        //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;
    }   

}
4

6 に答える 6

1

使用する

new Thread() {
    public void run() {
        final String data = getServerData(KEY_121);
        if (data != null)
            runOnUiThread(new Runnable()
            {
                public void run()
                {
                    txt.setText(data);
                }
            });
    }
}.start();

それ以外の:

 //call the method to run the data retreival
 txt.setText(getServerData(KEY_121));

メイン スレッドで長いタスクを実行することはできません。ただし、UI スレッドを使用してテキストを設定する必要があります。

于 2013-04-03T03:37:38.013 に答える
0

getServerData()問題は、UI スレッドからネットワーク リクエスト ( ) を実行しようとしていることです。ANR を回避するために許可されていません (ネットワーク接続がない場合や応答が遅い場合など)。

ネットワーク関連の操作用にスレッドを準備する方法については、簡単なスレッドの記事を参照してください。次に、ネットワーク操作を必要とするすべてのコードを別のスレッドに移動します。

于 2013-04-03T03:08:54.433 に答える
0

Android では、メイン (UI) スレッドで実行時間の長いネットワーク操作を行うことはできません。これを行うと、UI 全体がロックされるためです。ネットワーク操作を処理する新しいスレッドを作成する必要があります。AsyncTask を作成することをお勧めします。これは、メイン スレッド タスクから呼び出して実行できます。

new AST(this).execute;  //assuming you've created an AsyncTask class called AST

AsyncTasks のドキュメントは次のとおりです: http://developer.android.com/reference/android/os/AsyncTask.html

于 2013-04-03T03:09:07.223 に答える
0

問題は、UI スレッドでネットワーク接続を実行していることです。パフォーマンスとユーザー エクスペリエンスのために、Android ではそれが許可されていません。getServerData() をスレッドで囲んでみてください。

new Thread() {
    public void run() {
        getServerData();
    }
}.start();
于 2013-04-03T03:09:33.810 に答える
0

Android アプリのメイン スレッドでネットワーク アクティビティを行うことは想定されていません。そのための新しいスレッドをフォークする必要があります。

これを参照してください。

于 2013-04-03T03:09:44.620 に答える
0

すべての Android バージョン 3.0 以降では、UI スレッド (メイン スレッド) でネットワーク呼び出しを行うと、その例外がスローされ、アプリはすぐにクラッシュします。

代わりに、AsyncTask でサブクラスを作成し、そこから getServerData メソッドを呼び出す必要があります。

この件に関する公式ブログ記事はこちらです。

ここでAsyncTaskをチェックしてください

于 2013-04-03T03:12:55.337 に答える