gpt4 book ai didi

android - onPostExecute 方法永远不会在 AsyncTask 中被调用

转载 作者:行者123 更新时间:2023-11-29 22:03:36 25 4
gpt4 key购买 nike

我正在尝试从数据库服务器获取一些数据。我知道我无法在 UI 主线程上执行网络作业。我找到的解决方案是 AsyncTask。我覆盖了两个方法(onPostExecute,doInBackground),但是在 doInBackground 之后,onPostExecute 从未调用过,我的 android 手机 (galaxy s2) 强制我的应用程序停止。哪里错了?

public class MainActivity extends Activity {

EditText mResult;
private static final String TAG = "JSON";
String Json;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mResult = (EditText)findViewById(R.id.result);

Button btn = (Button)findViewById(R.id.parse);
btn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v){
getHtml("http://192.168.0.12/index.php");
//Json = getHtml("http://192.168.0.12/index.php");
Log.i(TAG, Integer.toString(5));
Log.i(TAG, Json);
Log.i(TAG, Integer.toString(6));
try{
String Result = "member list: \n";
JSONArray ja = new JSONArray(Json);
for(int j=0; j<ja.length(); j++)
{
JSONObject order = ja.getJSONObject(j);
Result +="ID : " + order.getInt("id") + " " +
"number : " + order.getInt("gisoo")+ " " +
"name : " + order.getString("name")+ " " +
"sex : " + order.getString("sex")+ " " +
"age : " + order.getInt("age")+ " " +
"school : " + order.getString("university")+ " " +
"phone : " + order.getString("phone")+ " " +
"no : " + order.getInt("numberOfVolunteer")+ " " +
"lastlogin : " + order.getString("lastLogin")+ " " +
"lastactivity : " + order.getString("lastVolunteer")+ " " +
"message : " + order.getString("message")+ "\n\n";
}
mResult.setText(Result);
} catch(JSONException e)
{
Toast.makeText(v.getContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
}
});
}

private void getHtml(String url)
{
new ProcessHtmlTask().execute(url);
}

private class ProcessHtmlTask extends AsyncTask<String, Void, String>{

@Override
protected void onPostExecute(String JSON){
Log.i(TAG, Integer.toString(8)); //I couldn't see number 8 in log.
Json = JSON;

return;
}

@Override
protected String doInBackground(String... addr){
StringBuilder jsonHtml = new StringBuilder();
HttpURLConnection conn;
try{
URL url = new URL(addr[0]);
conn = (HttpURLConnection)url.openConnection();

if(conn != null)
{

conn.setConnectTimeout(10000);
conn.setUseCaches(true);
int n = conn.getResponseCode();
Log.i(TAG, Integer.toString(n));
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "EUC-KR"));
for(;;){
String line = br.readLine();

if(line == null) break;
jsonHtml.append(line + "\n");
}

Log.i(TAG, Integer.toString(3));
br.close();
}
Log.i(TAG, Integer.toString(4));
conn.disconnect();
}

} catch(Exception ex){
Log.i(TAG, ex.getMessage());

}
Log.i(TAG, jsonHtml.toString());
Log.i(TAG, Integer.toString(5)); //I checked html string and number 5 showed up in log.
return jsonHtml.toString();
}
}

最佳答案

问题出在您的 onCLick 方法中。所有你想在 getHtml() 之后执行的都必须放在你的 onPostExecute 中。这是因为您的 AsyncTask 是异步执行的。

关于android - onPostExecute 方法永远不会在 AsyncTask 中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com