我正在尝试从我的AsyncTask返回一个数组回到我的Activity,因为我正在尝试从该数组创建一个ListView。 不幸的是,程序绑定错误,因为它不会让我返回一个数组。我的代码如下:
MainMenu课程:
public class MainMenu extends Activity {
String username;
public String[] returnValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_menu);
username ="user1";
if (checkInternetConnection()) {
try {
MainAsyncTask mat = new MainAsyncTask(MainMenu.this);
mat.execute(username);
} catch (Exception e) {
e.printStackTrace();
}
} else {
Toast.makeText(getApplicationContext(),"No internet connection. Please try again later",Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main_menu, menu);
return true;
}
private boolean checkInternetConnection() {
ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (conMgr.getActiveNetworkInfo() != null
&& conMgr.getActiveNetworkInfo().isAvailable()
&& conMgr.getActiveNetworkInfo().isConnected()) {
return true;
} else {
return false;
}
}}
MainAsyncTask:
public class MainAsyncTask extends AsyncTask<String, Void, Integer> {
private MainMenu main;
private String responseText, http;
private Ipaddress ipaddr = new Ipaddress(http);
private Context context;
public MainAsyncTask(MainMenu main) {
this.main = main;
}
protected Integer doInBackground(String... arg0) {
int responseCode = 0;
try {
HttpClient client = new HttpClient(main.getApplicationContext());
Log.e("SE3", ipaddr.getIpAddress());
HttpPost httpPost = new HttpPost(ipaddr.getIpAddress()
+ "/MainServlet");
List<NameValuePair> nvp = new ArrayList<NameValuePair>();
JSONObject json = new JSONObject();
json.put("username", arg0[0]);
Log.e("SE3", arg0[0]);
nvp.add(new BasicNameValuePair("data", json.toString()));
httpPost.setEntity(new UrlEncodedFormEntity(nvp));
HttpResponse response = client.execute(httpPost);
if (response != null) {
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(response.getEntity()
.getContent()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
responseText = sb.toString();
} catch (IOException e) {
Log.e("SE3", "IO Exception in reading from stream.");
responseText = "Error";
}
} else {
responseText = "Error";
}
} else {
responseText = "Response is null";
}
} catch (Exception e) {
responseCode = 408;
responseText = "Response is null";
e.printStackTrace();
}
return responseCode;
}
protected void onPostExecute(Integer result) {
if (result == 408 || responseText.equals("Error")
|| responseText.equals("Response is null")) {
Toast.makeText(main.getApplicationContext(),
"An error has occured, please try again later.",
Toast.LENGTH_SHORT).show();
} else {
JSONObject jObj;
try {
jObj = new JSONObject(responseText);
String folderString = jObj.getString("folder");
String [] folders = folderString.split(";");
//I need to return folders back to MainMenu Activity
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
我的问题是我应该如何修改以便能够在我的活动中读取我的数据,并且我的连接保持不变。
答案 0 :(得分:4)
我建议你像这样宣布你的MainAsyncTask
:
public class MainAsyncTask extends AsyncTask<String, Void, String[]> {
然后修改doInBackground
以执行您在onPostExecute
中正在执行的所有处理(Toast
部分除外)并让它返回String[]
(或{ {1}}如果有错误)。您可以将结果代码存储在null
的实例变量中,并在出错时返回MainAsyncTask
。然后null
可以访问与当前代码相同的信息。最后,如果没有错误,只需从onPostExecute
调用主活动中的方法来执行UI更新,并将onPostExecute
结果传递给它。