RunonUI Thread在Android中执行一个AsynTask从执行到完成

问题描述:

我遇到了runOnuiThread和AsyncTask一起调用的问题。RunonUI Thread在Android中执行一个AsynTask从执行到完成

我的AsynchTask通过runOnUIThread调用获取数据来填充listView。 即使用户界面不太好时,这个Asych Task也可以获取数据。它从UI屏幕开始运行,直到应用程序注销。 现在来自此任务的数据只能填充特定的列表视图。 现在,如果我使用调用executeOnExecutor调用AsynchTask从另一个视图调用另一个异步任务,则异步任务不会强制执行。它锁定了。 如果我注释掉永远不会结束的AsychTask的代码,称为Receiver ..那么所有UI的listview都会被填充,并且没有Asych Task锁定。 此Receiver在REST API调用上等待返回响应,但由于我通过executeonExecutor调用运行,因此它应该是并行处理。 我需要让接收器始终运行,因为这是我的应用程序的一个组成部分。 我可以在这里使用什么策略来解决这个问题。 这里是我的代码片段。

public class Receiver { 
    private final static String QUEUE_NAME = "hello"; 

    private String m_ErrorMessage; 
    private IRunOnUIThreadCallback iRunOnUIThreadCallback; 
    private Send m_Received; 
    private int m_TimeoutDuration;//how long the reading of new message waits in milli seconds 

    public void SetCallback(IRunOnUIThreadCallback runOnUIThreadCallback) 
    { 
     iRunOnUIThreadCallback = runOnUIThreadCallback; 
    } 
    public void SetTimeoutDuration(int timeout) 
    { 
     m_TimeoutDuration = timeout; 
    } 
    public void StartReceiver(Send receiverInfo) 
    { 
     String receivedInfo = null; 
     try { 
      new ReceiveInfo().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, receiverInfo); 
     } 
     catch(Exception exp) 
     { 
      m_ErrorMessage = exp.getMessage(); 
     } 
    } 
    private class ReceiveInfo extends AsyncTask<Send, Void, Send> 
    { 
     //initiate vars 
     public receive() { 
      super(); 
      //my params here 
     } 
     protected Message doInBackground(Send... receiverInfo) 
     { 
          Send recv=null; 
      try { 

       PreferenceSingleton single = PreferenceSingleton.getInstance(); 
       final User user = single.getUser(); 
       final SvcApi svc = LoginAuthSvc.init(); 


       Send send=(Send)receiverInfo[0]; 
       send.setUserId(user.getUsername()); 
       //dxbrem 
       while (true) { 

        recv=svc.receive(send); 
        String str= recv.get(); 
        if ((str == null || (str.trim().length() == 0))) { 
         continue; 
        } 

        //DJ uncomment 
        iRunOnUIThreadCallback.RunAfterIsReceived(recv); 
        //messages.add(message); 
        System.out.println(" [x] Received '" + recv + "'"); 

       } 

      }catch(Exception exp) 
      { 
       m_ErrorMessage = exp.getMessage(); 
      } 

      return recv; 
     } 
    } 
    public String getErrorMessage() { 
     return m_ErrorMessage; 
    } 
} 

public interface IRunOnUIThreadCallback { 
    public void RunAfterIsReceived(ByteSent m); 
    public void RunAfterIsReceived(Send m); 
} 

处理这个..具有下面的代码和

public class MainFragment extends Fragment implements MFragment.OnFragmentInteractionListener, IRunOnUIThreadCallback { 

    private Receiver mReceiver; 

    public void SetUICallbackOnMessageReceiver() 
     { 
      mReceiver.SetCallback(this); 
     } 

    private void callRunUIThread(final SentInfo m) { 
      getActivity().runOnUiThread(new Runnable() { 
       public void run() { 
        if (m!= null) { 
         mGridArray.add(message); 
         if (mListAdapter != null) { 
          mListAdapter.notifyDataSetChanged(); 
          mListView.setSelection(mListAdapter.getCount()); 
          mListView.smoothScrollToPosition(mListAdapter.getCount()); 
         } 
        } 
       } 
      }); // end of runOnUiThread 
     } 

    @Override 
     public void RunAfterIsReceived(ByteSent m) { 

     } 

     @Override 
      public void RunAfterIsReceived(Sent m) { 
       SentInfo m= new SentInfo(false, recv.getInfo()); 
       callRunUIThread(msg); 
      } 

mListAdapter是ListAdapater mListView是ListView的

这里是AsynchTask代码

import android.app.Activity; 
import android.app.Fragment; 

import android.content.Context; 
import android.os.AsyncTask; 
import android.util.Log; 



import java.util.concurrent.Callable; 
import java.util.concurrent.Executor; 

public class CallableTask<T> extends AsyncTask<Void,Double,T> { 

    private static final String TAG = CallableTask.class.getName(); 





    public static <V> void invoke(Callable<V> call,Activity activity, TaskCallback<V> callback){ 

     new CallableTask<V>(activity,call, callback).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    } 




    private Callable<T> callable_; 
    private AsyncTask<Void, Void, String> asyncTask_; 
    private Context context; 
    private Activity activity; 
    private Fragment fragmentActivity; 
    private android.support.v4.app.Fragment dynamicFragment; 

    private TaskCallback<T> callback_; 

    private Exception error_; 

    public CallableTask(Fragment actvy,Callable<T> callable, TaskCallback<T> callback) { 
     callable_ = callable; 
     callback_ = callback; 
     fragmentActivity=actvy; 
    } 

    public CallableTask(Activity actvy,Callable<T> callable, TaskCallback<T> callback) { 
     callable_ = callable; 
     callback_ = callback; 
     activity=actvy; 
    } 

    @Override 
    protected T doInBackground(Void... ts) { 
     T result = null; 
     try{ 
      result = callable_.call(); 
     } catch (Exception e){ 
      Log.e(TAG, "Error invoking callable in AsyncTask callable: " + callable_, e); 
      error_ = e; 
     } 
     return result; 
    } 

    @Override 
    protected void onPostExecute(T r) { 
     if(error_ != null){ 
      callback_.error(error_); 
     } 
     else { 
      callback_.success(r,activity); 
     } 
    } 


    public static <V> void invoke(Callable<V> call, Fragment _frg, TaskCallback<V> callback) { 
     new CallableTask<V>(_frg,call, callback).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    } 


// public CallableTask(android.support.v4.app.Fragment chatActivity,Callable<T> callable, TaskCallback<T> callback) { 
//  callable_ = callable; 
//  callback_ = callback; 
//  dynamicFragment=chatActivity; 
// } 
public CallableTask(android.support.v4.app.Fragment actvy,Callable<T> callable, TaskCallback<T> callback) { 
    callable_ = callable; 
    callback_ = callback; 
    dynamicFragment=actvy; 
} 

    public static <V> void invoke(Callable<V> call, android.support.v4.app.Fragment _frg, TaskCallback<V> callback) { 
     new CallableTask<V>(_frg,call, callback).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    } 
} 

这被称为这里...只有当点击按钮发送。

CallableTask.invoke(new Callable<Sent>() { 


      @Override 
      public Sent call() throws Exception { 
     }, this, new TaskCallback<Sent>() { 

      @Override 
      public void success(Sent result, Context context) { 
mGridArray.add(result); 
          if (mListAdapter != null) { 
           mListAdapter.notifyDataSetChanged(); 
           mListView.setSelection(mListAdapter.getCount()); 
           mListView.smoothScrollToPosition(mListAdapter.getCount()); 
} 
@Override 
      public void error(Exception e) { 
      } 
     }); 

感谢 Dhiren

+0

不是比AsyncTask长期运行的任务更好的选择吗? – nasch

+0

我正在阅读有关服务,但我不明白我如何可以为一个长期运行的任务接口服务,它将如何能够填充UI?特别是当我离开那个UI ListView并移动到另一个。 – user2358826

+0

那么如果ListView不再显示在屏幕上,没有什么可更新的,对吧? – nasch

我终于通过运行从发起的主题活动片段中的线程上Asynch.cancel电话解决了这个。当我离开活动。如果我没有,它阻止任何其他任务运行,