0

これは、JSON 配列を取得するための私のコードです。

    public void download_vse_igralce(View view)
{
    mylist.clear();  //sem dal v oklepaje
    String result = "";
    //the year data to send
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("year","1980"));
     InputStream is = null;
    //http post
    try{
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://gregor-apps.com/ubs/pokazi_vse_igralce.php");
            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++){
                    json_data = jArray.getJSONObject(i);


                    Log.i("log_tag","id: "+json_data.getInt("id")+
                            ", ime: "+json_data.getString("ime")+
                            ", priimek: "+json_data.getString("priimek")+
                            ", pozicija: "+json_data.getString("pozicija")
                            );

                            HashMap<String, String> map = new HashMap<String, String>();

                    map.put("id",  json_data.getString("id"));                    
                    map.put("firstname",  json_data.getString("ime"));                     
                    map.put("lastname",  json_data.getString("priimek"));   
                    map.put("position",  json_data.getString("pozicija"));  
                    map.put("height",  json_data.getString("height"));  
                    map.put("weight",  json_data.getString("weight"));  
                    map.put("hometown",  json_data.getString("hometown"));  
                    map.put("birthdate",  json_data.getString("birthdate"));    
                    map.put("jersey",  json_data.getString("number"));  
                    map.put("picture",  json_data.getString("slika"));
                    mylist.add(map);

            }
            downloadani_igralci=1;


    }

    }catch(JSONException e){
        downloadani_igralci=0;
            Log.e("log_tag", "Error parsing data "+e.toString());
    } 
    settings(view);
}

一般に、このコードはうまく機能し、必要に応じて Mylist を返します。しかし、時々、関数 download_vse_igralce() を呼び出すと、アプリケーションが反応しなくなります (ほとんどの場合、インターネット接続が弱い場合)。非同期スレッド (またはそのようなもの) をネットで検索しましたが、このコードに実装する方法がわかりません。読み込み時にユーザーが進行状況バーを表示できる方法はありますか?

4

4 に答える 4

0

このようなもの:

public void download_vse_igralce(View view){
  mylist.clear(); 
  JSONParserTask task = new JSONParserTask();
  task.execute();
}

private class JSONParserTask extends AsyncTask<Void, Void, Void> {

  protected Void doInBackground( Void... ignoredParams ) {
    String result = "";
//the year data to send
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("year","1980"));
 InputStream is = null;
//http post
try{
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://gregor-apps.com/ubs/pokazi_vse_igralce.php");
        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++){
                json_data = jArray.getJSONObject(i);


                Log.i("log_tag","id: "+json_data.getInt("id")+
                        ", ime: "+json_data.getString("ime")+
                        ", priimek: "+json_data.getString("priimek")+
                        ", pozicija: "+json_data.getString("pozicija")
                        );

                        HashMap<String, String> map = new HashMap<String, String>();

                map.put("id",  json_data.getString("id"));                    
                map.put("firstname",  json_data.getString("ime"));                     
                map.put("lastname",  json_data.getString("priimek"));   
                map.put("position",  json_data.getString("pozicija"));  
                map.put("height",  json_data.getString("height"));  
                map.put("weight",  json_data.getString("weight"));  
                map.put("hometown",  json_data.getString("hometown"));  
                map.put("birthdate",  json_data.getString("birthdate"));    
                map.put("jersey",  json_data.getString("number"));  
                map.put("picture",  json_data.getString("slika"));
                mylist.add(map);

        }
        downloadani_igralci=1;


}

}catch(JSONException e){
    downloadani_igralci=0;
        Log.e("log_tag", "Error parsing data "+e.toString());
} 
  }

  protected void onPostExecute( Void array ) {
    settings(view);
  }

}
于 2012-10-31T13:19:23.927 に答える
0

主な問題は、3 つの個別の try/catch ブロックがあることですが、実際に例外をキャッチすると処理を停止しないことだと思います。たとえば、最初に POST を実行し、失敗した場合はとにかく出力を読み取ろうとします。代わりにreturn;、catch ブロックで処理を停止する必要があります。

AsyncTasks も優れており、4.0 以降では必須ですが、問題の解決にはなりません。あなたもそれを調べるべきです。

于 2012-10-31T13:15:33.760 に答える
0

"接続が良好であっても、asynchTask はネットワークに到達できない問題を解決しません。"

次を追加することで修正できます。

httpclient.getConnectionManager().shutdown();

これにより、「キープアライブ」接続の問題が修正されます。

于 2014-04-12T19:37:20.317 に答える
0

これはインターネット接続のせいだと思います。アプリケーションが JSON コンテンツを適切にダウンロードできない場合があるため、解析しようとするとエラー状態になり、アプリケーションのクラッシュは不適切なスタイルの try-catch が原因です。

于 2012-10-31T13:58:55.533 に答える