2016-08-03 3 views
0

Android 앱을 서버에 연결하려고하는데 오류가 발생하고 무엇이 잘못되었는지 알 수 없습니다. 여기 Android의 서버 데이터베이스에 연결

내 MainActivity 클래스입니다 :

public class MainActivity extends AppCompatActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     try { 
      JsonReader jsonReader=new JsonReader(new JsonReader.AsyncResponse() { 
       @Override 
       public void processfinish(JSONObject output) { 
        Gson gson=new Gson(); 
        String message=gson.toJson(output); 
        Toast.makeText(getApplicationContext(),"this is "+message,Toast.LENGTH_LONG).show(); 
       } 
      }); 
      jsonReader.execute(); 


     } catch (IOException e) { 
      e.printStackTrace(); 
     }catch (Exception e){ 
      e.printStackTrace(); 

     } 
    } 
}  

이 내 JsonReader 클래스입니다 : How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?

그리고 내 PHP 서버 코드 :이 가이드를 사용하여 AsyncResponse을 만들어

public class JsonReader extends AsyncTask<String,String,JSONObject>{ 
    final static String myurl="http://example.com"; 
    public interface AsyncResponse{ 
     void processfinish(JSONObject output); 
    } 
    public AsyncResponse delegate = null; 

    public JsonReader(AsyncResponse delegate){ 
     this.delegate = delegate; 
    } 
    public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException { 
     InputStream is = new URL(url).openStream(); 
     try { 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 
      String jsonText = readAll(rd); 
      JSONObject json = new JSONObject(jsonText); 
      return json; 
     } 
     finally { 
      is.close(); 
     } 
    } 
    @Override 
    protected JSONObject doInBackground(String... strings) { 
     try { 
      JSONObject s = readJsonFromUrl(myurl); 
      return s; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    @Override 
    protected void onPostExecute(JSONObject jsonObject) { 
     super.onPostExecute(jsonObject); 
     delegate.processfinish(jsonObject); 
    } 
} 

:

<?php 
$dbhost = "myhost"; 
$dbuser = "myuser"; 
$dbname = "myname"; 
$dbpass = "mypassword"; 

$connect_db = mysql_connect ($dbhost, $dbuser, $dbpass); 
mysql_select_db($dbname,$connect_db); 
if ($connect_db){ 
    $result= mysql_query("SELECT * FROM `ask` ",$connect_db)or die(mysql_error()); 
    while($row = mysql_fetch_array($result)) 
    { 
     $qa=new StdClass(); 
     $qa->Question=$row['Question']; 
     $qa->Answer=$row['Answer']; 
     $qa->Answer2=$row['Answer2']; 
     $qa->Answer3=$row['Answer3']; 
     $qa->Answer4=$row['Answer4']; 
     echo "<br />"; 

     $rses=json_encode($qa); 
     echo $rses; 

    } 

}else{ 
    echo "error in connecting db"; 
} 
?> 

내 앱을 시작하면 "this is null"이라고 표시되지만 브라우저에서 PHP 코드를 열면 데이터가 올바르게 표시됩니다. 무엇이 문제입니까?

업데이트 :

내가 다른 URL과 그 일을 사용했다. 그래서 문제가 내 PHP codes.i에있는 echo "<br />"; 을 제거하고 브라우저에서 열었습니다. {"Question":"question","Answer":"a","Answer2":"b","Answer3":"c","Answer4":"d"} json 형식에는 전문적이지 않지만 올바른 형식이 아닌 것으로 생각합니다.이 문제를 해결할 수 있습니까?

+0

당신이 어떤 오류를받을 수 있나요 단지 toString 있도록, 당신은 output로 된 JSONObject가

String message=gson.toJson(output); 

필요가 없다? –

+0

응용 프로그램이 크래시없이 컴파일하고 "this is null"이라는 텍스트로 축배를 보여 주지만 server.and의 json 데이터와 "E/Surface : getSlotFromBufferLocked : unknown buffer : 0xeb1cb8a0"이 표시된 logcat에 "this is" 그것을 위해 안드로이드 6.0.0 버그가 보이지만 안드로이드 4.4.2에서 테스트 한 결과는 같았다. –

+1

당신의 머큐리가 말 그대로 * http : // example.com이 아니라고 생각하고 있습니다. 실제로 인터넷에서 또는 적어도 장치가 연결된 네트워크에서 확인할 수 있고 도달 할 수있는 실제 URL입니까? – alzee

답변

0

브라우저가 HTML을 올바르게 렌더링합니다. 그리고 이것은 눈

echo "<br />"; 

안드로이드 전적으로 문자열의 콘텐츠에 대한 관심에 표시되지 않습니다, 그래서 그 휴식 태그를 구문 분석 할 수 없습니다.

당신은 당신이 그것을 잡아 null을 반환 불구하고 JSONParseException이 일어나고 볼 수있는 로그 캣을 검사 할 수 있으므로 응용 프로그램은 만 PHP

에서 그리고 이후 JSON을 에코

충돌하지 않습니다 while 루프를 가지고 있다면, JSONArray를 빌드하고 JsonObject를 한 줄씩 파싱하는 대신 파싱해야한다.

또한,이

+0

PHP 코드를 제거하고 응용 프로그램을 실행하지만 여전히 null이며 출력이 null이므로 'toString' 응용 프로그램이 작동하지 않을 때도 표시됩니다. –

+0

** 전체 ** logcat없이 앱이 왜 작동하지 않는지 추측 할 수 있습니다. 또한 배열을 사용하여 해당 행을 제거하지 말아야한다고 말했습니다. 하지만 json을 파싱 할 수 없을 때 null을 반환하므로 NullPointerException이 실제 문제를 숨기고 있습니다. –