2016-07-27 19 views
0

Ich bin mit okhttp für Netzwerkanforderungen und responses.I hat eine Menge auf dem Web durchsucht und auch auf Github zu diesem Thema, aber ich bekommen habe keine saubere Lösung, ich don Ich weiß nicht, was im Code falsch ist. Ich bekomme NullPointerException, wenn ich auf Btn_Proceed klicke. Der Code wird bereitgestellt und auch der Stacktrace. Vielen Dank.java.lang.NullPointerException mit okhttp3 android

07-28 02:11:18.407 16167-17029/com.donateblood.blooddonation E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
Process: com.donateblood.blooddonation, PID: 16167 
java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:300) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:864) 
Caused by: java.lang.NullPointerException 
at okhttp3.HttpUrl.canonicalize(HttpUrl.java:1853) 
at okhttp3.FormBody$Builder.add(FormBody.java:110) 
at com.donateblood.blooddonation.UploadImage$AddUserAsync.doInBackground(UploadImage.java:203) 
at com.donateblood.blooddonation.UploadImage$AddUserAsync.doInBackground(UploadImage.java:173) 
at android.os.AsyncTask$2.call(AsyncTask.java:288) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:864) 
public class UploadImage extends AppCompatActivity { 

    @InjectView(R.id.imageView) ImageView ImageUpload; 
    @InjectView(R.id.upload) Button Btn_Upload; 
    @InjectView(R.id.proceed) Button Btn_Proceed; 
    EditText code; 
    public ProgressDialog pDialog; 
    public String bloodgroup,name,password,number,email,age,ID; 
    public String encodedPhotoString=null; 
    GPSTracker gps; public Bitmap myimage=null; 
    public JSONObject json =null; 
    public double latitude; 

    public double longitude; 
    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     finish(); 
    } 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     try{ 
      setContentView(R.layout.uploadimage); 
      ButterKnife.inject(this); 
     }catch (OutOfMemoryError e){ 
      Toast.makeText(getBaseContext(), "Sorry,Something went wrong", Toast.LENGTH_SHORT).show(); 
     } 


     code = (EditText) findViewById(R.id.code); 
     myimage = CroppingActivity.finalImage; 
     CheckImage(); 
     // Upload image ==================================== 
     Btn_Upload.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getApplicationContext(), CroppingActivity.class); 
       startActivity(intent); 
       UploadImage.this.finish(); 
      } 
     }); 
     Btn_Proceed.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(code.length()==0){ 
        Toast.makeText(getBaseContext(), "Enter verification code", Toast.LENGTH_LONG).show(); 
       } 
       else { 
        Prcoess(); 
       } 
      } 
     }); 
    } 
    public void CheckImage(){ 
     if(myimage!=null){ 
      Uri uri = getImageUri(myimage); 
      String url = getRealPathFromURI(uri); 
      File file = new File(url); 
      Glide.with(UploadImage.this).load(file).asBitmap().diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).override(300,300) 
        .transform(new CenterCrop(UploadImage.this),new CustomCenterCrop(UploadImage.this)).into(ImageUpload); 

     }else { 
      encodedPhotoString= null; 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (pDialog != null) { 
      pDialog.dismiss(); 
      pDialog = null; 
     } 
    } 

    public String getRealPathFromURI(Uri contentUri) { 
     Cursor cursor = null; 
     try { 
      String[] proj = { MediaStore.Images.Media.DATA }; 
      cursor = UploadImage.this.getContentResolver().query(contentUri, proj, null, null, null); 
      int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
      cursor.moveToFirst(); 
      return cursor.getString(column_index); 
     } finally { 
      if (cursor != null) { 
       cursor.close(); 
      } 
     } 
    } 

    public Uri getImageUri(Bitmap inImage) { 

     String path = MediaStore.Images.Media.insertImage(UploadImage.this.getContentResolver(), inImage, "Title", null); 
     return Uri.parse(path); 
    } 

    // Processing and adding user to database from here ==================================== 
    public void Prcoess(){ 
     String userentered=code.getText().toString(); 
     String sentcode = SignupActivity.Code; 
     setPhoto(); 
     if(userentered.equals(sentcode) && encodedPhotoString!=null){ 

      new AddUserAsync().execute(); 

     } 
     else { 
      Toast.makeText(getBaseContext(), "Oopps...Sorry...Upload Again", Toast.LENGTH_LONG).show(); 
     } 
    } 

    public void setPhoto() { 
     // resize the image to store to database 
     myimage= getResizedBitmap(myimage,400,400); 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     myimage.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
     byte[] byte_arr = stream.toByteArray(); 
     encodedPhotoString = Base64.encodeToString(byte_arr, 0); 
     Log.e("photo string ", encodedPhotoString); 
    } 


    public class AddUserAsync extends AsyncTask<Void,Void,Void> { 

     JSONObject json = null; 
     String fromServer = ""; 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(UploadImage.this); 
      pDialog.setMessage("Creating Account..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 
     @Override 
     protected Void doInBackground(Void... voids) { 
      GetUserDetails(); 
      GenerateGCMID(); 
      email= email.trim().toLowerCase(); 
      //HashMap<String ,String> userDetails = new HashMap<>(); 
      latitude = GPSTracker.getLatitude(); 
      longitude = GPSTracker.getLongitude(); 
      OkHttpClient client = new OkHttpClient.Builder() 
        .connectTimeout(50, TimeUnit.SECONDS) 
        .writeTimeout(50, TimeUnit.SECONDS) 
        .readTimeout(50, TimeUnit.SECONDS) 
        .build(); 

      FormBody.Builder formBuilder = new FormBody.Builder() // Null pointer exception is thrown here 
        .add("ID",ID) 
        .add("Name",name) 
        .add("email",email) 
        .add("password",password) 
        .add("age",age) 
        .add("number",number) 
        .add("bloodgroup",bloodgroup) 
        .add("lat",latitude+"") 
        .add("longi",longitude+"") 
        .add("image",encodedPhotoString); 

      RequestBody formBody = formBuilder.build(); 
      Request request = new Request.Builder() 
        .url("http://faceblood.website/blood_app/Adduser.php") 
        .post(formBody) 
        .build(); 
      try { 
       Response response = client.newCall(request).execute(); 
       String res = response.body().string(); 
       json = new JSONObject(res); 
       fromServer = json.getString("added"); 
       Log.e("stringtest",json.getString("added")); 
       // Do something with the response. 
      } catch (IOException e) { 
       Log.e("stringtest IO",e.toString()); 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       Log.e("stringtest JSON",e.toString()); 
       e.printStackTrace(); 
      } 
      //json = new HttpCall().postForJSON("http://faceblood.website/blood_app/Adduser.php",userDetails); 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      pDialog.dismiss(); 

      Log.e("fromServer",fromServer); 
      if(fromServer.equals("addeduser")){ 
       Toast.makeText(getBaseContext(), "Created Successfully", Toast.LENGTH_LONG).show(); 
       onSignupSuccess(); 
      }else { 
       Toast.makeText(getBaseContext(), "Network problem. Click again", Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
    public void GenerateGCMID(){ 
     GCMClientManager pushClientManager = new GCMClientManager(this, "921544902369"); 
     pushClientManager.registerIfNeeded(new GCMClientManager.RegistrationCompletedHandler() { 
      @Override 
      public void onSuccess(String registrationId, boolean isNewRegistration) { 
       ID = registrationId; 
       Log.e("reg",ID); 
      } 
      @Override 
      public void onFailure(String ex) { 
       super.onFailure(ex); 
      } 
     }); 
    } 
    // Go to another activity on success ==================================== 
    public void onSignupSuccess() { 
     // stop the service we got the latitude and longitude now 
     myimage.recycle(); 
     myimage = null; 
     ImageUpload.setImageResource(0); 
     stopService(new Intent(this, GPSTracker.class)); 
     Intent intent = new Intent(getApplicationContext(), LoginActivity.class); 
     startActivity(intent); 
     finish(); 
    } 

    // fetch user details ==================================== 
    public void GetUserDetails(){ 

     bloodgroup = SignupActivity.bloodgroup.toString(); 
     name = SignupActivity.name.toString(); 
     email = SignupActivity.email.toString(); 
     password = SignupActivity.password.toString(); 
     number = SignupActivity.number.toString(); 
     age = SignupActivity.age.toString(); 
    } 


    // Resize the image ==================================== 
    public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) 
    { 
     int width = bm.getWidth(); 
     int height = bm.getHeight(); 
     float scaleWidth = ((float) newWidth)/width; 
     float scaleHeight = ((float) newHeight)/height; 
     // create a matrix for the manipulation 
     Matrix matrix = new Matrix(); 
     // resize the bit map 
     matrix.postScale(scaleWidth, scaleHeight); 
     // recreate the new Bitmap 
     Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); 
     return resizedBitmap; 
    } 
} 
+0

'UploadImage.java verweisen: 203', welche Linie 203? – csmckelvey

+0

In der Methode doInBackground diese Zeile FormBody.Builder formBuilder = new FormBody.Builder() @takendarkk –

+0

Sie benötigen keine AsyncTask, um OkHttp-Anfragen zu verwenden - es unterstützt asynchrone Anfragen –

Antwort

2

Hint

bei okhttp3.FormBody $ Builder.add (FormBody.java:110)
bei ... upload $ AddUserAsync.doInBackground (UploadImage.java : 203)

Sie haben einen Nullwert hinzugefügt hier auf die Form (in Zeile 203)

FormBody.Builder formBuilder = new FormBody.Builder() 
     .add("ID",ID) 
     .add("Name",name) 
     .add("email",email) 
     .add("password",password) 
     .add("age",age) 
     .add("number",number) 
     .add("bloodgroup",bloodgroup) 
     .add("lat",latitude+"") 
     .add("longi",longitude+"") 
     .add("image",encodedPhotoString); 

Was ich vermute, bin beginnt entweder von hier, wo Sie eine andere asynchrone Anforderung tun.

public void GenerateGCMID(){ 
    GCMClientManager pushClientManager = new GCMClientManager(this, "921544902369"); 
    pushClientManager.registerIfNeeded(new GCMClientManager.RegistrationCompletedHandler() { 
     @Override 
     public void onSuccess(String registrationId, boolean isNewRegistration) { 
      ID = registrationId; 
      Log.e("reg",ID); 
     } 
     @Override 
     public void onFailure(String ex) { 
      super.onFailure(ex); 
     } 
    }); 
} 

Oder hier, weil static Werte nicht sind, wie Sie Daten zwischen Aktivitäten passieren. Sie können einen EditText-Wert von der aktuellen Aktivität nicht zu einem anderen "erreichen".

// fetch user details ==================================== 
public void GetUserDetails(){ 

    bloodgroup = SignupActivity.bloodgroup.toString(); 
    name = SignupActivity.name.toString(); 
    email = SignupActivity.email.toString(); 
    password = SignupActivity.password.toString(); 
    number = SignupActivity.number.toString(); 
    age = SignupActivity.age.toString(); 
} 

Sie zu How do I pass data between Activities