2014-09-25 54 views
-1

我有一个使用Asyncttask的应用程序,但我想在执行完一个任务后执行两个任务。但我无法这样做,所以你可以请给我伪代码。 这里是我的AsyncTask类在我的Android应用程序中一个接一个地调用Asynctask

@SuppressWarnings("unused") 
private class getresponse extends AsyncTask<String, Void, Void>{ 
    ProgressDialog pd ; 

    private Context _context; 

    public getresponse(Context c) 
    { 
     _context = c; 
    } 

    @Override 
    protected void onPreExecute() { 

     progressDialog = new ProgressDialog(MainActivity.this); 
     pd = new ProgressDialog(_context); 
      pd.setTitle("Getting JSON details"); 
      pd.setMessage("Please wait..."); 
      pd.setCancelable(false); 
      pd.setIndeterminate(true); 
      pd.show(); 
     super.onPreExecute(); 
    } 


    @SuppressWarnings("static-access") 
    @Override 
    protected Void doInBackground(String... params) { 
     try { 
      /*String t = finduserjson.substring(
        finduserjson.indexOf("{"), 
        finduserjson.lastIndexOf(",{")); 
      String j = "]}"; 
      finduserjson = t + j; 
      Log.d("FINDUSERJSON", "FINDUSERJSON" + finduserjson);*/ 
      jsonobject1.put("username", params[0]); 
      jsonobject1.put("udid", 
        "A892E0AB-6732-4F42-BEFA-3157315E9EE4"); 
      socket.emit("setPseudo", jsonobject1); 
      socket.emit("findAllUsers", jsonobject1); 

      Log.e("TAG",""+ socket.getId()); 
     } catch (JSONException | MalformedURLException e1) { 
      if (pd.isShowing()) 
        pd.dismiss(); 
      e1.printStackTrace(); 
     } 



    return null; 
    } 
    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     try 
     { 
      if (pd.isShowing()) 
       pd.dismiss(); 
     } 
     catch(Exception e) 
     { 

     } 

     /*String t = finduserjson.substring(
        finduserjson.indexOf("{"), 
        finduserjson.lastIndexOf(",{")); 
      String j = "]}"; 
      finduserjson = t + j; 
      Log.d("FINDUSERJSON", "FINDUSERJSON" + finduserjson); 

       Intent intent = new Intent(MainActivity.this, 
         MenuScreen.class); 
       intent.putExtra("onlineuser", onlineuser); 
       intent.putExtra("finduser", finduserjson); 
       startActivity(intent);*/ 
     new getresponse111(MainActivity.this).execute(); 
    } 



    @Override 
    protected void onCancelled() { 
     // TODO Auto-generated method stub 
     super.onCancelled(); 
     pd.dismiss(); 
    } 



} 
private class getresponse111 extends AsyncTask<Void, Void, Void>{ 


    private Context _context; 

    public getresponse111(Context c) 
    { 
     _context = c; 
    } 

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


    @SuppressWarnings("static-access") 
    @Override 
    protected Void doInBackground(Void... params) { 
     String t = finduserjson.substring(
       finduserjson.indexOf("{"), 
       finduserjson.lastIndexOf(",{")); 
     String j = "]}"; 
     finduserjson = t + j; 
     Log.d("FINDUSERJSON", "FINDUSERJSON" + finduserjson); 



    return null; 
    } 
    @Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 

       Intent intent = new Intent(MainActivity.this, 
         MenuScreen.class); 
       intent.putExtra("onlineuser", onlineuser); 
       intent.putExtra("finduser", finduserjson); 
       startActivity(intent); 
    } 



    @Override 
    protected void onCancelled() { 
     // TODO Auto-generated method stub 
     super.onCancelled(); 

    } 



} 

错误是继在另一个的AsyncTask的onPostExecute

09-25 13:00:30.997: E/AndroidRuntime(5906): FATAL EXCEPTION: AsyncTask #3 
09-25 13:00:30.997: E/AndroidRuntime(5906): java.lang.RuntimeException: An error occured while executing doInBackground() 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at android.os.AsyncTask$3.done(AsyncTask.java:299) 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at java.lang.Thread.run(Thread.java:841) 
09-25 13:00:30.997: E/AndroidRuntime(5906): Caused by: java.lang.NullPointerException 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at com.example.socketserver.MainActivity$getresponse111.doInBackground(MainActivity.java:231) 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at com.example.socketserver.MainActivity$getresponse111.doInBackground(MainActivity.java:1) 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
09-25 13:00:30.997: E/AndroidRuntime(5906):  at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
09-25 13:00:30.997: E/AndroidRuntime(5906):  ... 4 more 
+0

直接询问码**所以可以请你只给我的伪代码。** ..哇!!!! – 2014-09-25 06:51:05

+0

我不明白你想完成什么,我只看到1个异步任务,不是你想要执行同一个Asynctask的2个实例吗? – zozelfelfo 2014-09-25 06:54:24

+0

你想要伪代码,所以,你得到伪代码,你知道,你应该从AsyncTask的onTaskComplete方法中正确地得到你的结果(你的Activity应该实现的接口或者实现该接口的额外类)确保数据在异步任务后可用。你怎么做,是在'onPostExecute'中调用Activity的'onTaskComplete',它叫做AsyncTask。一个实际的例子是在这里http://www.jameselsey.co.uk/blogs/techblog/extracting-out-your-asynctasks-into-separate-classes-makes-your-code-cleaner/亲切的问候 – 2014-09-25 07:00:07

回答

1

你异步任务,我已经发布了一些的伪代码。

class AsyncTask1 extends AsynTask<Void, Void, String>{ 
     @Override 
     protected String doInBackground(Void... params) { 
      //TODO something 
      return s; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void onPostExecute(String result) { 
      // Handle JSON response of your result. 
      //TODO call another AsyncTask 
      AsyncTask2.execute(); 
     } 
    } 

在另一个AsyncTask的postExecute中,你可以调用你需要的任何Activity。

class AsyncTask2 extends AsynTask<Void, Void, String>{ 
      @Override 
      protected String doInBackground(Void... params) { 
       //TODO something 
       return s; 
      } 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void onPostExecute(String result) { 
       // Handle JSON response of your result. 
       //TODO call Activity 

      } 
     } 
+0

我明白,他希望在他的asyncTask之后执行JSON操作。如果他想执行2个不同的异步任务,我会得到第一个的结果,然后我执行第二个。问候 – 2014-09-25 07:04:46

+0

执行这些操作后,最后可以调用另一个Asynctask。 – Supriya 2014-09-25 07:07:05

+0

好吧,然后,正确地得到你的第一个异步任务的结果,如你的第一篇文章的评论中所解释的,在onTaskComplete中你可以调用下一个异步任务。如果第一个数据对于第二个数据是必要的,那么确保数据可用性如此。 Regards – 2014-09-25 07:11:46

0

利用onPostExecute()方法。像,

@Override 
    protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     try 
     { 
      if (pd.isShowing()) 
       pd.dismiss(); 
     } 
     catch(Exception e) 
     { 

     } 

    // If you want to call one more AsyncTask then call it here 
    // new AsyncClassName(_context).execute(); Your question is vague, please clarify it. 

     String t = finduserjson.substring(
      finduserjson.indexOf("{"), 
      finduserjson.lastIndexOf(",{")); 
    String j = "]}"; 
    finduserjson = t + j; 
    Log.d("FINDUSERJSON", "FINDUSERJSON" + finduserjson); 

     Intent intent = new Intent(MainActivity.this, 
       MenuScreen.class); 
     intent.putExtra("onlineuser", onlineuser); 
     intent.putExtra("finduser", finduserjson); 
     startActivity(intent); 

    } 
+0

兄弟我已经做到了,但它给了我错误。我已在我的问题 – Mehdi 2014-09-25 07:07:36

+0

更新是完整的logcat跟踪? – Aniruddha 2014-09-25 07:22:21

+0

是bro bro log只显示这么多 – Mehdi 2014-09-25 07:29:46

0

简单地说你的代码onPostExecute方法: 这种方法onBackground后调用,并从它你就可以开始你的另一个的AsyncTask或启动活动或任何其他操作。

@Override 
protected void onPostExecute(Void result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    String t = finduserjson.substring(
      finduserjson.indexOf("{"), 
      finduserjson.lastIndexOf(",{")); 
    String j = "]}"; 
    finduserjson = t + j; 
    Log.d("FINDUSERJSON", "FINDUSERJSON" + finduserjson); 
    try 
    { 
     if (pd.isShowing()) 
      pd.dismiss(); 
     Intent intent = new Intent(MainActivity.this, 
       MenuScreen.class); 
     intent.putExtra("onlineuser", onlineuser); 
     intent.putExtra("finduser", finduserjson); 
     startActivity(intent); 
    } 
    catch(Exception e) 
    { 
    } 
} 

You can read about onPostExecute

+0

我收到错误消息,因为我已更新错误代码 – Mehdi 2014-09-25 07:13:16

+0

尝试删除此行super.onPostExecute(result); – 2014-09-25 07:17:09

+0

仍然出现错误.... – Mehdi 2014-09-25 07:27:28

2

步骤 ::

  • 只需用两个AsyncTasks
  • 开始从onStart()
  • 从第一 的AsyncTask的onPostExecute()启动第二的AsyncTask第一的AsyncTask
  • 所以当第一AsyncTask完成第二AsyncTask是 开始immideately

Here is an Example:: 

public class FrgLatein extends Fragment { 
     //New-Instance 
     public static FrgLatein newInstance(){ 
      Log.d("FrgLatein", "newInstance"); 
      FrgLatein fragment = new FrgLatein(); 
      return fragment; 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      Log.d("FrgLatein", "onCreateView"); 
      View view=inflater.inflate(R.layout.frg_latein, container, false); 
      setHasOptionsMenu(true); 


      return view; 
     } 

     @Override 
     public void onActivityCreated(Bundle savedInstanceState) { 
      Log.d("FrgLatein", "onActivityCreated"); 
      super.onActivityCreated(savedInstanceState); 

     } 

     @Override 
     public void onStart() { 
      Log.d("FrgLatein", "onStart"); 
      super.onStart(); 
      new LongOperation1().execute(""); 

     } 

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

      @Override 
      protected String doInBackground(String... params) { 
       // Do the Web service long run here 
       return "Executed"; 
      } 

      @Override 
      protected void onPostExecute(String result) { 
       // Do the UI-task here 
       new LongOperation2().execute(""); 
      } 

      @Override 
      protected void onPreExecute() { 
       // Do the UI-task here 
      } 

      @Override 
      protected void onProgressUpdate(Void... values) { 
       // Do the UI-task here which has to be done during backgroung tasks are running like a downloading process 
      } 
     } 



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

      @Override 
      protected String doInBackground(String... params) { 
       // Do the Web service long run here 
       return "Executed"; 
      } 

      @Override 
      protected void onPostExecute(String result) { 
       // Do the UI-task here 
      } 

      @Override 
      protected void onPreExecute() { 
       // Do the UI-task here 
      } 

      @Override 
      protected void onProgressUpdate(Void... values) { 
       // Do the UI-task here which has to be done during backgroung tasks are running like a downloading process 
      } 
     } 

    } 
+0

完成samr的事情,但得到错误 – Mehdi 2014-09-25 08:18:35

+0

@Mehdi ...嗯...我也注意到你在'AsyncTasks'之间传递上下文......它没有必要我想! – Devrath 2014-09-25 08:38:59

+0

仍然我得到错误 – Mehdi 2014-09-25 08:55:25

相关问题