在UI线程之前运行处理程序线程

时间:2013-08-09 09:48:06

标签: android multithreading handler

我正在尝试从dump(这是一张地图)获取json数据。所以Idea是在活动启动时后台线程读取Json数据和转储。现在,UI线程运行,并且应该从转储数据更新ArrayList。

我的代码是

Public class myclass extends ListActivity{

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

    MyHandlerMethod();
ArrayList deals = new ArrayList(SessionStore.getFromDump("someData"));
}

MyHandlerMethod(){

//A handler thread
//Json parsing and adding data to dump runs here
 }

}

// Sessionstore类有getFromDump()方法,里面有map来存储数据。

//运行MyHandlerMethod时,应该更新此地图。

但我每次在MyHandlerMethod()之前运行UI线程,因此SessionStore.getFromDump(“someData”)保持为空。

如何确保在UI线程之前运行Handler线程。

它是一个列表活动。我真正想要的是arraylist应该从dump更新,我使用该数组列表进行列表活动。

4 个答案:

答案 0 :(得分:3)

您应该使用 AsyncTask ,并使用onProgressUpdate / publishProgress和onPostExecute方法更新您的UI。

http://developer.android.com/reference/android/os/AsyncTask.html

以下是一个如何运作的示例:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {

     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]); // here you can for example update your progress bar, your textviews, whatever UI...
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

答案 1 :(得分:1)

您应该使用AsyncTask获取数据数据,然后更新UI线程。 Here the reference.

答案 2 :(得分:1)

你基本上不能在UI线程之前运行HandlerThread。但是,您可以等待后台任务加载图像,同时显示ProgressDialog。 我建议你使用AsyncTask。

这是一个关于后台进程的好教程,包括AsyncTask。

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

答案 3 :(得分:0)

如果您不想或不能使用AsyncTask,可能您想指定Thread优先级或其他。

您可以启动HandlerThread,然后致电getLooper()以获取其Looper,然后您可以将其传递给Handler,以便它可以接收和处理该消息线程。

但使用AsyncTask是一个简单的解决方案。