2013-07-28 16 views
0

我试图从服务中得到响应(响应出现在json中)。 我做了我的检查,如果设备连接,现在我需要对服务进行http请求。我发现在其他问题上我必须使用后台线程,但我不确定是否有工作示例。Android从平静的服务中读取json

因此,我需要找出如何可以连接到给定的uri并阅读响应。 我的服务需要得到一个内容头application/json来返回一个json,所以在请求之前我需要设置这个头。

预先感谢您

UPDATE

package com.example.restfulapp; 

import android.app.AlertDialog; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.provider.Settings; 
import org.apache.http.HttpResponse; 
import org.apache.http.StatusLine; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.IOException; 

import java.io.InputStreamReader; 
import java.util.concurrent.ExecutionException; 


public class MainActivity extends Activity { 

    private int code = 0; 
    private String value = ""; 
    private ProgressDialog mDialog; 
    private Context mContext; 
    private String mUrl ="http://192.168.1.13/myservice/upfields/"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if (!isOnline()) 
     { 
      displayNetworkOption ("MyApp", "Application needs network connectivity. Connect now?"); 
     } 

     try { 
      JSONObject s = getJSON(mUrl); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 

    } 

    public class Get extends AsyncTask<Void, Void, String> { 
     @Override 
     protected String doInBackground(Void... arg) { 
      String linha = ""; 
      String retorno = ""; 

      mDialog = ProgressDialog.show(mContext, "Please wait", "Loading...", true); 

      HttpClient client = new DefaultHttpClient(); 
      HttpGet get = new HttpGet(mUrl); 

      try { 
       HttpResponse response = client.execute(get); 

       StatusLine statusLine = response.getStatusLine(); 
       int statusCode = statusLine.getStatusCode(); 

       if (statusCode == 200) { // Ok 
        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

        while ((linha = rd.readLine()) != null) { 
         retorno += linha; 
        } 
       } 
      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      return retorno; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      mDialog.dismiss(); 
     } 
    } 

    public JSONObject getJSON(String url) throws InterruptedException, ExecutionException { 
     setUrl(url); 

     Get g = new Get(); 

     return createJSONObj(g.get()); 
    } 

    private void displayNetworkOption(String title, String message){ 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder 
       .setTitle(title) 
       .setMessage(message) 
       .setPositiveButton("Wifi", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialogInterface, int i) { 
         startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); 
        } 
       }) 
       .setNeutralButton("Data", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialogInterface, int i) { 
         startActivity(new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS)); 
        } 
       }) 
       .setNegativeButton("No", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialogInterface, int i) { 
         return; 
        } 
       }) 
       .show(); 
    } 

    private boolean isOnline() { 
     ConnectivityManager cm = 
       (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
     if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
      return true; 
     } 
     return false; 
    } 


} 

这引发错误: 摇篮:找不到符号法setUrl(java.lang.String中) 摇篮:找不到符号法createJSONObj(java中。 lang.String)

+0

我尝试了很多来自web的例子,没有起作用,大部分都需要使用permitAll而不是正确的方式 –

+0

你能告诉我们代码和相关文章或文章吗?看起来你正在等待某人编写你的代码。显示你的代码,我相信有人会帮助解决它。 – EvZ

+0

请提供一个代码示例以及您卡在哪里。 –

回答

1

经过EvZ的贬低回应后,他认为自己出生时知道一切,于是我结束了一个MyTask子类,我在我的Activity的onCreate内部调用了这个子类。

new MyTask().execute(wserviceURL); 



private class MyTask extends AsyncTask<String, Void, String> { 
      @Override 
      protected String doInBackground(String... urls) { 
       URL myurl = null; 
       try { 
        myurl = new URL(urls[0]); 
       } catch (MalformedURLException e) { 
        e.printStackTrace(); 
       } 
       URLConnection connection = null; 
       try { 
        connection = myurl.openConnection(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       connection.setConnectTimeout(R.string.TIMEOUT_CONNECTION); 
       connection.setReadTimeout(R.string.TIMEOUT_CONNECTION); 

       HttpURLConnection httpConnection = (HttpURLConnection) connection; 
       httpConnection.setRequestProperty("Content-Type", getString(R.string.JSON_CONTENT_TYPE)); 

       int responseCode = -1; 
       try { 
        responseCode = httpConnection.getResponseCode(); 
       } catch (SocketTimeoutException ste) { 
        ste.printStackTrace(); 
       } 
       catch (Exception e1) { 
        e1.printStackTrace(); 
       } 
       if (responseCode == HttpURLConnection.HTTP_OK) { 
        StringBuilder answer = new StringBuilder(100000); 

        BufferedReader in = null; 
        try { 
         in = new BufferedReader(new InputStreamReader(httpConnection.getInputStream())); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        String inputLine; 

        try { 
         while ((inputLine = in.readLine()) != null) { 
          answer.append(inputLine); 
          answer.append("\n"); 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        try { 
         in.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        httpConnection.disconnect(); 
        return answer.toString(); 
       } 
       else 
       { 
        //connection is not OK 
        httpConnection.disconnect(); 
        return null; 
       } 

      } 

      @Override 
      protected void onPostExecute(String result) { 
       String userid = null; 
       String username = null; 
       String nickname = null; 
       if (result!=null) 
       { 
        try { 
         //do read the JSON here 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
       //stop loader dialog 
       mDialog.dismiss(); 


      } 

     } 

lory105的回答引导我到答案附近的某个地方,thanx。

0

从Android 3+开始,http连接必须在单独的线程内完成。 Android提供了一个名为AsyncTask的类,可以帮助您做到这一点。

Here你可以找到一个AsyncTask的例子,它执行一个http请求并接收一个JSON响应。

请记住,在doInBackgroud(..)方法中,您不能修改UI,例如启动Toast,更改活动或其他。您必须使用onPreExecute()或onPostExecute()方法来执行此操作。

ADD

对于支持mDialog和mContext变量,添加下面的代码,当你创建JSONTask写new JSONTask(YOUR_ACTIVITY)

public abstract class JSONTask extends AsyncTask<String, Void, String> { 

    private Context context = null; 
    ProgressDialog mDialog = new ProgressDialog(); 

    public JSONTask(Context _context){ context=_context; } 

..

+0

好吧,我发现这个例子较早,但mDialog,mContext,但我得到像Gradle错误:无法找到符号变量mDialog 这些mXXXX变量如何得到声明?我必须在这里错过一些非常简单的事情。 –

+0

看到我在answare中添加 – lory105

+0

我在我的活动课上宣布了他们。 现在我得到错误 Gradle:找不到符号方法setUrl(java.lang.String) Gradle:找不到符号方法createJSONObj(java.lang.String) 我要用我当前的代码更新我的帖子 –

0

这里是如何的例子处理HTTP响应并转换为JSONObject:

/** 
* convert the HttpResponse into a JSONArray 
* @return JSONObject 
* @param response 
* @throws IOException 
* @throws IllegalStateException 
* @throws UnsupportedEncodingException 
* @throws Throwable 
*/ 
public static JSONObject processHttpResponse(HttpResponse response) throws UnsupportedEncodingException, IllegalStateException, IOException { 
    JSONObject top = null; 
    StringBuilder builder = new StringBuilder(); 
    try { 
      BufferedReader reader = new BufferedReader(
             new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 

      for (String line = null; (line = reader.readLine()) != null;) { 
       builder.append(line).append("\n"); 
       } 

     String decoded = new String(builder.toString().getBytes(), "UTF-8"); 
     Log.d(TAG, "decoded http response: " + decoded); 

     JSONTokener tokener = new  JSONTokener(Uri.decode(builder.toString())); 

     top = new JSONObject(tokener); 



    } catch (JSONException t) { 
     Log.w(TAG, "<processHttpResponse> caught: " + t + ", handling as string..."); 

    } catch (IOException e) { 
     Log.e(TAG, "caught: " + e, e); 
    } catch (Throwable t) { 
     Log.e(TAG, "caught: " + t, t); 
    } 
    return top; 
}