2014-02-24 101 views
2

我有一個問題,而試圖從我的應用程序發送到服務器的圖像。我知道它在哪裏崩潰。 這些都是我的文件:應用程序崩潰嘗試發送圖像的Android

RestClient.java

package edu.gvsu.cis.masl.camerademo; 

import android.util.Log; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; 
import org.apache.http.client.methods.HttpPut; 
import org.apache.http.client.methods.HttpUriRequest; 
import org.apache.http.entity.StringEntity; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.BasicHttpParams; 
import org.apache.http.params.HttpConnectionParams; 
import org.apache.http.params.HttpParams; 
import org.apache.http.util.EntityUtils; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 


public class RestClient { 

private static final int DEFAULT_CONNECTION_TIMEOUT = 30000; 
private static final int DEFAULT_RECEIVE_TIMEOUT = 60000; 
//private static final String AUTHORIZATION = "Authorization"; 
private static final String CONTENT_TYPE = "Content-Type"; 
private static final String JSON_CONTENT_TYPE = "application/json; charset=utf-8"; 
private static final String UTF8 = "UTF8"; 
private static final String DEBUG = RestClient.class.getName(); 


public Result put(String url, String json) { 
    return executeRequest(new HttpPut(url), json, DEFAULT_RECEIVE_TIMEOUT); 
} 



private Result executeRequest(HttpEntityEnclosingRequestBase request, String json, int timeout) { 
    request.addHeader(CONTENT_TYPE, JSON_CONTENT_TYPE); 
    try { 
     request.setEntity(new StringEntity(json,UTF8)); 
    }catch(UnsupportedEncodingException e) { 
     Log.e(DEBUG, e.getMessage()); 
     return Result.error(); 
    } 
    return executeRequest(request,timeout); 
} 


private Result executeRequest(HttpUriRequest request, int timeout) { 

    int responseCode = -1; 
    String responseContent = null; 
    //request.addHeader(AUTHORIZATION, encodeCredentials(userCredentials)); 
    HttpParams httpParams = new BasicHttpParams(); 
    HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_CONNECTION_TIMEOUT); 
    HttpConnectionParams.setSoTimeout(httpParams, timeout); 
    HttpClient client = new DefaultHttpClient(httpParams); 

    try { 
     HttpResponse response = client.execute(request); 
     HttpEntity entity = response.getEntity(); 
     responseCode = response.getStatusLine().getStatusCode(); 
     if(entity!=null) { 
      responseContent = EntityUtils.toString(entity, UTF8); 
     } 

    }catch(IOException e) { 
     Log.e(DEBUG, e.getMessage()); 
     return Result.error(); 
    } 
    return new Result(responseCode, responseContent); 
} 


} 

ImageDTO.java:

public class ImageDTO { 

public String id; 
public String image; 

public ImageDTO(String id, String image) { 
    this.id = id; 
    this.image=image; 
} 

}

Result.java:

package edu.gvsu.cis.masl.camerademo; 

public class Result { 

public static final int COMMUNICATION_ERROR = -1; 
public static final int OK_SUCCESS = 200; 
public static final int BAD_REQUEST = 400; 
public static final int UNAUTHORIZED = 401; 
public static final int NOT_FOUND = 404; 
public static final int INTERNAL_SERVER_ERROR = 500; 

private int responseCode; 
private String resultContent; 

public Result(int responseCode, String resultContent) { 
    this.responseCode = responseCode; 
    this.resultContent = resultContent; 
} 

public int getResponseCode() { 
    return this.responseCode; 
} 

public String getResultContent() { 
    return this.resultContent; 
} 

public static Result error() { 
    return new Result(COMMUNICATION_ERROR, "ERROR"); 
} 

} 

和代碼在我的與此相關的活動:

String strBase64 = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
      int id = 1; 

      ImageDTO imdto = new ImageDTO(Integer.toString(id), strBase64); 

      RestClient client = new RestClient(); 
      String jsonDTO = new Gson().toJson(imdto); 

      Log.i("Pablo", jsonDTO); 
      Result result = client.put(SERVICE_URL, jsonDTO); 
      if (result.getResponseCode() != 200) Log.i("****************", "Oups! Smth went wrong!!!"); 
      else Log.i("****************", "Response = 200 , Connection Established :D"); 

我的應用程序在RestClient.java失敗,在這條線:

HttpResponse response = client.execute(request); 

我不知道爲什麼會失敗,因爲RESTClient實現和結果文件工作在其他項目的罰款。

我也不得不說,Base64的代碼是不完整的顯示在IntelliJ IDEA的。如果我詢問最新的字符,它是正確的,但它不能以日誌模式顯示它們。

這是示出日誌中的失敗:

ERROR/AndroidRuntime(27028): FATAL EXCEPTION: main 
    Process: edu.gvsu.cis.masl.camerademo, PID: 27028 
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=-1, data=null} to activity {edu.gvsu.cis.masl.camerademo/edu.gvsu.cis.masl.camerademo.MyCameraActivity}: android.os.NetworkOnMainThreadException 
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3365) 
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3408) 
    at android.app.ActivityThread.access$1300(ActivityThread.java:135) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5017) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
    at dalvik.system.NativeStart.main(Native Method) 
    Caused by: android.os.NetworkOnMainThreadException 
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 
    at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
    at java.net.InetAddress.getAllByName(InetAddress.java:214) 
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
    at edu.gvsu.cis.masl.camerademo.RestClient.executeRequest(RestClient.java:61) 
    at edu.gvsu.cis.masl.camerademo.RestClient.executeRequest(RestClient.java:46) 
    at edu.gvsu.cis.masl.camerademo.RestClient.put(RestClient.java:33) 
    at edu.gvsu.cis.masl.camerademo.MyCameraActivity.onActivityResult(MyCameraActivity.java:78) 
    at android.app.Activity.dispatchActivityResult(Activity.java:5423) 
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3361) 
    ... 11 more 
+0

發佈logcat –

+0

補充,我認爲這是你的意思 – Biribu

+2

使用AsyncTask將圖像發送到服務器。 –

回答

3

所致:android.os.NetworkOnMainThreadException

原因: ,其應用程序嘗試時拋出該異常在其主線程上執行聯網操作。

這只是拋出應用針對蜂窩SDK或更高。針對早期SDK版本的應用程序允許在其主要事件循環線程上進行聯網,但非常不鼓勵。

參考NetworkOnMainThreadException以獲取更多信息。

問題: 您正在做Main thread (UI thread)的網絡相關任務/操作。

解決方案: 它應該在worker thread完成。 在這種情況下,您可以使用android提供的AsyncTask。 在AsyncTaskdoInbackground方法來執行所有與網絡相關的任務。

備註: 您還可以使用StrictMode

StrictMode是一個開發工具,它通過檢測意外的東西,你可能會做,並帶來了他們對你的注意力,讓你可以解決這些問題。

StrictMode最常用於捕獲應用程序主線程上的意外磁盤或網絡訪問,其中接收UI操作並進行動畫發佈。保持主線程不受磁盤和網絡操作影響,可以提供更平滑,更響應的應用程序。通過保持應用程序的主線程響應,您還可以防止ANR dialogs顯示給用戶。

有關更多信息,請參閱StrictMode

相關問題