2016-12-27 1 views
0

En essayant avec le serveur client (récupérer des données mysql) avec l'aide d'un tutoriel, je reçois beaucoup d'erreurs. Je viens de lire quelques fils ici et je compris que la plus grande erreur que je reçoisAndroid DownloadFilesTask concept

erreur http connectionandroid.os.NetworkOnMainThreadException E/log_tag: résultat conversion erreur java.lang.NullPointerException

pourrait être parce que j'ai besoin d'une tâche d'assistance entre le thread et le gestionnaire.

J'ai le code suivant, je comprends ce concept et normalement cela devrait fonctionner.

package de.irgendwas; 

import android.app.Activity; 
import android.net.ParseException; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.android.gms.appindexing.Action; 
import com.google.android.gms.appindexing.AppIndex; 
import com.google.android.gms.appindexing.Thing; 
import com.google.android.gms.common.api.GoogleApiClient; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
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 java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URL; 

public class MainActivity extends Activity { 
    private GoogleApiClient client; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     /** Called when the activity is first created. */ 

     String result = null; 
     InputStream is = null; 
     StringBuilder sb = null; 

     //http post 
     try { 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://localhost/connect_db.php"); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 
      Log.e("log_tag", "connection established"); 
     } 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, "utf-8"), 8); 
      sb = new StringBuilder(); 
      sb.append(reader.readLine() + "\n"); 
      String line = "0"; 
      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()); 
     } 

     //paring data 
     int fd_id = 0; 
     String fd_name = ""; 
     try { 
      JSONArray jArray = new JSONArray(result); 
      JSONObject json_data = null; 
      Toast.makeText(getBaseContext(), "1. try Block", Toast.LENGTH_LONG).show(); 
      for (int i = 0; i < jArray.length(); i++) { 
       json_data = jArray.getJSONObject(i); 
       fd_id = json_data.getInt("artist"); 
       fd_name = json_data.getString("title"); 
      } 
     } catch (JSONException e1) { 
      Toast.makeText(getBaseContext(), "No Data Found", Toast.LENGTH_LONG).show(); 
     } catch (ParseException e1) { 
      e1.printStackTrace(); 
     } 

     //print received data 
     TextView t = (TextView) findViewById(R.id.text); 
     t.setText("ID: " + fd_id + " Name: " + fd_name); 
     // ATTENTION: This was auto-generated to implement the App Indexing API. 
     // See https://g.co/AppIndexing/AndroidStudio for more information. 
     client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); 
    } 

    /** 
    * ATTENTION: This was auto-generated to implement the App Indexing API. 
    * See https://g.co/AppIndexing/AndroidStudio for more information. 
    */ 
    public Action getIndexApiAction() { 
     Thing object = new Thing.Builder() 
       .setName("Main Page") // TODO: Define a title for the content shown. 
       // TODO: Make sure this auto-generated URL is correct. 
       .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]")) 
       .build(); 
     return new Action.Builder(Action.TYPE_VIEW) 
       .setObject(object) 
       .setActionStatus(Action.STATUS_TYPE_COMPLETED) 
       .build(); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 

     // ATTENTION: This was auto-generated to implement the App Indexing API. 
     // See https://g.co/AppIndexing/AndroidStudio for more information. 
     client.connect(); 
     AppIndex.AppIndexApi.start(client, getIndexApiAction()); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 

     // ATTENTION: This was auto-generated to implement the App Indexing API. 
     // See https://g.co/AppIndexing/AndroidStudio for more information. 
     AppIndex.AppIndexApi.end(client, getIndexApiAction()); 
     client.disconnect(); 
    } 

} 

Je ne vais pas poster le script php sur le serveur, parce que si je l'appelle l'URL via un navigateur, il délivre mon testdata correctement, il devrait donc être bien.

Maintenant lors de l'exécution de l'application, je reçois les erreurs ci-dessus. En cherchant sur le web, j'ai trouvé le concept DownloadFilesTask, il semble que ce devrait être la solution. Mais je ne comprendrai pas, je ne suis pas capable de l'implémenter dans mon code. Quelqu'un peut-il aider ou est-il un bon tutoriel quelque part en dehors de celui sur developer.android.

Répondre

1

L'erreur se produit car vous souhaitez effectuer un processus de mise en réseau dans le thread UI. Vous devez le déplacer loin de votre fil d'interface utilisateur. Pour votre cas, vous pouvez utiliser AsyncTask. AsyncTask est un mécanisme permettant d'exécuter des opérations dans un thread d'arrière-plan sans avoir à gérer manuellement la création ou l'exécution de threads. Les AsyncTasks ont été conçus pour être utilisés pour des opérations courtes (quelques secondes au maximum) et vous pouvez utiliser un Service et/ou un Executor pour des tâches très longues. AsyncTask est généralement utilisé pour les tâches longues qui ne peuvent pas être effectuées sur le thread UI, telles que le téléchargement de données réseau à partir d'une API ou l'indexation de données provenant d'un autre emplacement sur le périphérique.

Veuillez lire Creating and Executing Async Tasks.

Voici un example for using AsyncTask dans le réseau processus connexe:

public class MainActivity extends Activity { 
    private ImageView ivBasicImage; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ivBasicImage = (ImageView) findViewById(R.id.ivBasicImage); 
     String url = "https://i.imgur.com/tGbaZCY.jpg"; 
     // Download image from URL and display within ImageView 
     new ImageDownloadTask(ivBasicImage).execute(url); 
    } 

    // Defines the background task to download and then load the image within the ImageView 
    private class ImageDownloadTask extends AsyncTask<String, Void, Bitmap> { 
     ImageView imageView; 

     public ImageDownloadTask(ImageView imageView) { 
      this.imageView = imageView; 
     } 

     protected Bitmap doInBackground(String... addresses) { 
      Bitmap bitmap = null; 
      InputStream in; 
      try { 
       // 1. Declare a URL Connection 
       URL url = new URL(addresses[0]); 
       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
       // 2. Open InputStream to connection 
       conn.connect(); 
       in = conn.getInputStream(); 
       // 3. Download and decode the bitmap using BitmapFactory 
       bitmap = BitmapFactory.decodeStream(in); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
       if(in != null) 
       in.close(); 
      } 
      return bitmap; 
     } 

     // Fires after the task is completed, displaying the bitmap into the ImageView 
     @Override 
     protected void onPostExecute(Bitmap result) { 
      // Set bitmap image for the result 
      imageView.setImageBitmap(result); 
     } 
    } 
} 
0

Vous devriez également obtenir cette exception connecté Log.e("log_tag", "Error in http connection" + e.toString());
Ceci est dû à cette ligne

HttpPost httppost = new HttpPost("http://localhost/connect_db.php"); 

Cela pointera toujours du périphérique localhost et pas le serveur. Donc, vous devez utiliser:

HttpPost httppost = new HttpPost("http://10.0.2.2/connect_db.php"); 

Ceci est la cause de l'exception NullPointer sur result

+0

non, j'ai changé le nom de l'URL originale avec localhost –

+0

@ pia-sophie je l'ai suggéré une modification, parce que je pense que cette information est nécessaire dans la question, car elle ne peut être supposée. Pour éviter toute autre personne suivant ce chemin. – Bantu

+0

J'ai changé le script en utilisant HttpURLConnection, maintenant cela fonctionne assez bien aussi en combinaison avec AsyncTask, donc je l'ai eu. –