gpt4 book ai didi

Android - AsyncTask 未执行

转载 作者:IT老高 更新时间:2023-10-28 22:16:14 27 4
gpt4 key购买 nike

我知道这个标题已经有很多问题,但我仍然没有找到适合我的案例的解决方案。

我有以下代码从在线数据库中获取用户数据。如标题所述,问题是 AsyncTask 没有启动。

这是我的代码:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getData(); // retrieves "friends" data from database
FloatingActionButton btn3 = (FloatingActionButton) findViewById(R.id.button_add_new_friend);
btn3.setBackgroundTintList(getResources().getColorStateList(R.color.Blonde));
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

LayoutInflater layoutInflater = LayoutInflater.from(profile.this);
View promptView = layoutInflater.inflate(R.layout.input_new_friend, null);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(profile.this);
alertDialogBuilder.setView(promptView);

final EditText editText1 = (EditText) promptView.findViewById(R.id.edittext_addnewfriend);

// setup a dialog window
alertDialogBuilder.setCancelable(false)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

InputStream is = null;

// add values to the database
String friend = "" + editText1.getText();

// Verify the user in the USERS database - get users data from the dabase
GetDataJSON g = new GetDataJSON();
g.execute();
if (friends.contains(friend)) // if you are already friends with that user
Toast.makeText(getApplicationContext(), "You are already friends with that user!",
Toast.LENGTH_LONG).show();
else {
if (!users.contains(friend)) // the user doesn't exist in our database
Toast.makeText(getApplicationContext(), "That user doesn't exist! You either haven't introduced the right email or he's not a registered user within Poinder.",
Toast.LENGTH_LONG).show();
else // the user exists so we add him to the friends list
{
//do something
}
}

// Getting the users
protected void showList2(){
try {
JSONObject jsonObj = new JSONObject(myJSON);
people = jsonObj.getJSONArray(TAG_RESULTS);

for(int i=0;i<people.length();i++){
JSONObject c = people.getJSONObject(i);
String user = c.getString(TAG_USER);
String email = c.getString(TAG_EMAIL);
Double location_latitude = c.getDouble(TAG_LATITUDE);
Double location_longitude = c.getDouble(TAG_LONGITUDE);

users.add(email);
}

} catch (JSONException e) {
e.printStackTrace();
}

}

// Getting the users
private class GetDataJSON extends AsyncTask<Void, Void, String> {

@Override
protected String doInBackground(Void... params) {
DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
HttpPost httppost = new HttpPost("http://xxxxxxx/friends_out.php");

// Depends on your web service
httppost.setHeader("Content-type", "application/json");

InputStream inputStream = null;
String result = null;
try {
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();

inputStream = entity.getContent();
// json is UTF-8 by default
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();

String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
result = sb.toString();
} catch (Exception e) {
// Oops
}
finally {
try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
}
return result;
}

@Override
protected void onPostExecute(String result){
myJSON=result;
showList2();
}
}

知道我应该改用什么其他方法吗?或者最好我应该如何修改这个工作以及为什么我的 AsyncTask 永远不会启动?

编辑:我应用了下面提到的所有建议,不幸的是,到目前为止它们都不起作用(我的 AsyncTask 仍然没有启动)。

还有一个问题:在同一个 Activity 中使用多个 AsyncTask 与我的问题有关吗?

最佳答案

由于(我假设)其他建议的解决方案都不起作用,我怀疑您的问题在于 AsyncTask 的执行方式。如果多个 AsyncTask 在同一个 Activity 中执行,例如在您的应用程序中,那么这些 AsyncTask 将不会并行执行。他们将一个接一个地执行。

我怀疑您的其他 AsyncTask 正在长时间运行,因此您的 GetDataJSON AsyncTask 正在等待其他任务完成。

解决方案是启用 AsyncTask 的并行执行。使用以下代码并行执行 AsyncTasks。

GetDataJSON g = new GetDataJSON();
g.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

来自 AsyncTask 文档:

Order of execution

When first introduced, AsyncTasks were executed serially on a single background thread. Starting with DONUT, this was changed to a pool of threads allowing multiple tasks to operate in parallel. Starting with HONEYCOMB, tasks are executed on a single thread to avoid common application errors caused by parallel execution.

If you truly want parallel execution, you can invoke executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.

希望这会有所帮助。

关于Android - AsyncTask 未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31957815/

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