Android – AsyncTask不执行

我知道这个标题已经有很多问题了,但是我还没有find解决scheme来解决我的问题。

我有以下代码从联机数据库中获取用户数据。 问题是,如标题所述, 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永远不会启动?

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

另一个问题:在同一个活动中使用多个AsyncTask与我的问题有什么关系?

Solutions Collecting From Web of "Android – AsyncTask不执行"

由于没有其他build议的解决scheme工作,我怀疑你的问题在于AsyncTask的执行方式。 如果多个AsyncTasks在同一个Activity中执行,就像在你的应用中一样,那么这些AsyncTasks将不会并行执行。 他们将一个接一个执行。

我怀疑你的其他AsyncTask(s)是长时间运行,所以你的GetDataJSON AsyncTask正在等待其他任务来完成。

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

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

从AsyncTask文档:

执行顺序

首次引入时,AsyncTasks在单个后台线程上被串行执行。 从DONUT开始,将其更改为允许多个任务并行操作的线程池。 从HONEYCOMB开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

如果真的需要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。

希望这可以帮助。

只要改变你的asyntask参数

  class GetDataJSON extends AsyncTask<String, Void, String> 

至,

  class GetDataJSON extends AsyncTask<Void, Void, String> 

从你的问题我得出结论,你试图从服务器上得到朋友列表,并根据结果,你会显示Toast消息。

根据您的代码,您不是创build并显示alertDialogBu​​ilder的AlertDialog。 尝试显示AlertBox。

AsyncTask在一个单独的线程中运行。 因此,

 if (friends.contains(friend)) 

会在之后立即执行

  g.execute(); 

所以,即使用户在朋友列表中,也会显示其他部分的Toast。

另外,你没有把日志放在Asynctask方法中,这可能会给你一个AsyncTask没有运行的印象。

我会build议你将你的条件代码从AlertDialogonPostExecute()方法,并放在showList2(); 。 另外,将一些日志放在AsyncTask方法中。

希望这会有所帮助。 请find以下代码供您参考:

 public class AIssue extends Activity { String result = " DATA"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.some); findViewById(R.id.button1).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View arg0) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() .permitAll().build(); StrictMode.setThreadPolicy(policy); AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( AIssue.this); alertDialogBuilder.setCancelable(false); alertDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { GetDataJSON g = new GetDataJSON(); g.execute(); } }); alertDialogBuilder.create().show(); } }); } // Getting the users private class GetDataJSON extends AsyncTask<Void, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); Log.e("IN", "ONPRE EXECUTE"); } @Override protected String doInBackground(Void... params) { String result = "SOME DATA"; for (int i = 0; i < 10; i++) { try { Thread.sleep(1000); Log.e("IN", "DO IN BACKGROUND"); } catch (InterruptedException e) { e.printStackTrace(); result = "ERROR"; } } return result; } @Override protected void onPostExecute(String result) { Log.e("IN", "ON POST EXECUTE"); Log.e("IN", "" + result); /***** * Your Condition to Check The Friend should be here after * showList2(); * ***/ if (result.equalsIgnoreCase("SOME DATA"))// replace it with your // condition to check // friends { Log.e("IN", "IF"); } else { Log.e("IN", "ELSE"); } } } } 

在getData2()方法里面试试这个:

 new AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { // your code } @Override protected void onPostExecute(String result){ // your code } }.execute(); 

或者如果它不工作,把AsyncTask类的方法外,然后直接调用执行AsyncTask类而不是getData2(),像这样

 new GetDataJSON().execute(); 

在Aysc任务中添加这个覆盖方法。

  @Override protected void onPreExecute() { super.onPreExecute(); } 

我不知道你在这里做什么,但是这个代码将在你的asynchronous任务完成之前执行。

 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 } 

如果你想在ury asyc任务完成后执行这段代码,那么在你的showList2()方法里面添加这段代码。

顺便说一下,为什么你在内部方法里面创buildasynchronous任务。 它的主意不好。 创build单独的aynch任务。 所以你可以使用其他活动。

在AsyncTask上添加一个构造函数

 public GetDataJSON (){ } 

添加onPreExecute更加确定

 @Override protected void onPreExecute() { super.onPreExecute(); Toast.makeText(this /*or getActivity()*/,"IT'S WORKING!!!", Toast.LENGTH_LONG).show(); } 

我不认为强制严格模式正在帮助这种情况。 编码networking操作时(比如doInBackground方法中的操作),您应该使用AsyncTask而不是严格模式,这样您的UI就不会被阻塞。

严格模式将强制操作在应用程序的主线程上运行,而AsyncTask在后台线程上运行。

问题是你的asynctask参数

谷歌的Android文档说:

asynchronous任务由3个genericstypes定义,称为Params,Progress和Result,以及4个步骤,分别称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute。

AsyncTask的genericstypes:

asynchronous任务使用的三种types如下:

谷歌的Android文档说:

AsyncTask的genericstypes:

asynchronous任务使用的三种types如下:

  1. 参数,执行时发送给任务的参数的types。
  2. 进度,在后台计算期间发布的进度单位的types。
  3. 结果,后台计算结果的types。

并非所有types总是由asynchronous任务使用。 要将某个types标记为未使用,只需使用typesVoid:

  private class MyTask extends AsyncTask<Void, Void, Void> { ... } 

所以,因为你不发送任何params的AsyncTask使你的asynchronous任务如下

  // Getting the users public void getData2(){ new GetDataJSON().execute(); } class GetDataJSON extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... params) { /// your logic here return result; } @Override protected void onPostExecute(String result){ // your logic here } } 

针对这个问题的一个解决scheme,我介绍到当前的开发中的是AsyncService,我不会使用这个库的所有function(疼痛系统),但是function强大,它也可以帮助您清理活动中的代码。

  1. 您使用@AsyncService注释声明您的服务,将要检索数据
  2. 你在你的活动中注入服务
  3. 随时随地致电您的服务
  4. 在您的活动中使用注释@OnMessage声明一个方法,您将在其中处理服务响应…

AsyncService GitHub Wiki

我不知道是否存在另一个解决scheme,帮助开发人员分离问题和清理代码(在Android中是这样的),这是我尝试过的最好的方法,也许你也应该尝试一下。 当然,它会帮助你解决你目前的问题。

希望能帮助到你。