我调试了我的程序,我注意到我无法在同一个线程上运行网络(我搜索此错误就像2天,因为在虚拟设备中,应用程序没有遇到问题 - .-)。所以现在我知道我必须如何修复它,但我不知道如何给doinBackground方法提供一些并非所有String的参数。
我的方法需要一个url方法,这些方法可以在doInBackground方法中使用params [0]和params [1]进行访问。但是对于NameValuePairs列表,我怎样才能在doInBackground方法中访问它?
非常感谢你的帮助:))
这是我的班级:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.AsyncTask;
import android.util.Log;
public class JSONParser extends AsyncTask<String, Void, JSONObject>{
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
// Funktion um JSON aus einer URL zu holen
// Es wird ein POST oder ein GET Request gesendet
public JSONObject makeHttpRequest(String url, String method,
List<NameValuePair> params) {
// HTTP Request erstellen
try {
// Überprüfen welche Request Methode benutzt werden soll
if(method == "POST"){
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY,
CookiePolicy.BROWSER_COMPATIBILITY);
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}else if(method == "GET"){
DefaultHttpClient httpClient = new DefaultHttpClient();
String paramString = URLEncodedUtils.format(params, "utf-8");
url += "?" + paramString;
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//Stream in ein String umwandeln
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Fehler!", "Fehler mein umwandeln von Stream in String: " + e.toString());
}
// JSON Object parsen
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// Das JSONObject zurückgeben
return jObj;
}
@Override
protected JSONObject doInBackground(String... params) {
// TODO Auto-generated method stub
return null;
}
}
答案 0 :(得分:2)
我认为您完全不了解AsyncTasks的完整概念。如果要在后台线程中运行操作,可以使用这些,这是完成此任务的一种非常好/灵活的方法。对我来说真正好的是onPostExecute()
在主线程上执行,所以一旦你的工作在doInBackground()
完成,它就可以做一些有力的事情。您应该记住,因为onPostExecute()
确实在主线程上执行,您不希望在此执行任何网络操作。
以下是AsyncTask的一个简单示例:
private class myAsyncTask extends AsyncTask<String, Void, Boolean> {
@Override
protected void onPreExecute() {
// before we start working
}
@Override
protected Boolean doInBackground(String... args) {
//do work in the background
return true;
}
@Override
protected void onPostExecute(Boolean success) {
// the work is done.. now what?
}
}
doInBackground()
是您将完成大部分工作的地方,因此我将尽力帮助您完成所需的基本结构。我只是复制并粘贴了我认为应该去的代码,所以这不是100%保证,但希望它能帮助你开始做你想做的事情:
private class JSONParser extends AsyncTask<String, Void, JSONObject> {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// variables passed in:
String url;
String method;
List<NameValuePair> params;
// constructor
public JSONParser(String url, String method,
List<NameValuePair> params) {
this.url = url;
this.method = method;
this.params = params;
}
@Override
protected JSONObject doInBackground(String... args) {
try {
if(method == "POST"){
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY,
CookiePolicy.BROWSER_COMPATIBILITY);
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} else if(method == "GET"){
DefaultHttpClient httpClient = new DefaultHttpClient();
String paramString = URLEncodedUtils.format(params, "utf-8");
url += "?" + paramString;
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Fehler!", "Fehler mein umwandeln von Stream in String: " + e.toString());
}
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
return jObj;
}
@Override
protected void onPostExecute(JSONObject obj) {
// Now we have your JSONObject, play around with it.
}
}
编辑:
我忘了提到你也可以传入args
这是一个字符串数组。您可以在调用AsyncTask时创建args并传入它:
new JSONParser(url, method, params).execute(args);
您可以访问doInBackground()
以下是有关AyncTask的更多信息:http://developer.android.com/reference/android/os/AsyncTask.html