Articles of multithreading

Android 4.0 asynctask在同一时间不可能

我有同样的问题同时运行多个AsyncTasks – 不可能? 除了我使用android 4.0与android:minSdkVersion =“14”。 我尝试了他的例子,并得到: bar bar bar bar bar bar bar bar bar 编辑: 我在这里find了解决scheme 而不是使用: task.execute(); 使用 : task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);

当closures主线程时,我怎样才能让一些代码尽快在主线程上运行?

我有一个部分基于Web的用户界面(WebView)。 它通过一个Javascript接口连接到Android UI。 当您点击WebView中的某个元素时,JavaScript会调用Android,Android会接收到javascript / web线程中的调用。 不是UI(主)线程。 它在1毫秒或更less的毫秒内到达Android。 那里没问题。 但是,因为我想现在改变UI,我不得不切换到UI线程。 (如果您从主线程修改UI,则Android会引发exception)。 我目前正在UI线程上使用处理程序,并调用post() 。 这个代码(一个Runnable)随后在120到300毫秒之间被调用。 这是UI从用户的触摸改变非常明显的滞后。 有没有办法让一些代码更快地在UI线程上运行? 以下是一些示例代码: 接口类: public class JSInterface { public void test() { // Arrives here in 1ms after calling AndroidInterface.test(). Arrives n the web thread. runOnUiThread(new Runnable() { @Override public void run() { // Arrives here 100ms to 300ms after calling […]

Android的AsyncTask onPostExecuteclosures主要的UI线程

我有一个与AsyncTask和onPostExecute问题。 我发现onPostExecute执行在不同于主ui线程的线程上,当我修改任何视图时,会导致发生CalledFromWrongThreadException。 我把一些日志logging,看看哪些线程onPreExecute,doInBackground和onPostExecute正在运行。 我会看到像这样的结果… onPreExecute ThreadId: 1 doInBackground ThreadId: 25 onPostExecute ThreadId: 18 我相信主要的UI线程ID是1,我希望onPre和onPost都在线程1上执行。我确保创build并从UI线程(例如在Activity的onCreate)中调用execute方法。 另外需要注意的是,后来的asynchronous任务将在与之前的asynchronous任务onPostExecute方法(本例中为线程18)相同的线程上运行onPostExecute方法。 现在为了解决这个问题,我在调用runOnUiThread的时候将代码封装在onPostExecute方法中,但是我认为这很冒充,希望能够解决真正的问题。 我没有想法! 任何人有任何见解? 我很乐意回答任何有助于进一步调查的问题! 编辑: asynchronous任务在代码中运行有两种方法。 我想知道这些例子中的后者是否会造成奇怪的事情发生? public class SomeActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); new SomeAsyncTask().execute(); } private class SomeAsyncTask extends AsyncTask<String, Void, Integer> { @Override public void onPreExecute() { Thread.currentThread().getId() // 1 […]

Cordova插件阻塞线程

我正在为Android cordova / phonegap应用程序创build一个自定义插件,而本地Java端则启动了一个包含由它启动的服务调用的callback的活动。 这个想法是,callback从服务中得到每秒钟左右,而且效果很好,但问题是,我似乎无法得到这个在另一个线程运行,所以主cordova线程被阻止,应用程序是完全没有反应。 根据我正在做的这个文件: @Override public boolean execute(String action, JSONArray args, final CallbackContext context) throws JSONException { /* snip */ cordova.getThreadPool().execute(new Runnable() { public void run() { Intent myIntent = new Intent(this.cordova.getActivity(), myMonitoring.class); this.cordova.getActivity().startActivity(myIntent); callbackContext.success(); } }); return true; } 我知道这里的JScallback将永远不会被调用(即callbackContext.success(); ),因为该活动阻止,但不应该实际的phonegap线程后return true保持运行? 如果我删除了startActivity调用,那么应用程序继续按预期工作。

闩锁(用于等待asynchronous响应)冻结WebView(和UI)

我有一个应用程序,显示在整个布局的webview。 有时我需要调用一个asynchronous方法,asynchronous操作由一个三方sdk完成,然后等待一段时间,直到获得对指定侦听器的响应。 我用锁存器解决了这个问题 – 一旦收听者收到响应,我计数下锁存器,然后启动方法可以继续响应。 不幸的是,当我这样做时,WebView卡住了。 我猜想原生UI会卡住,但我没想到webview也被冻结了。 这怎么能克服? 为了更清楚,这里是一个例子。 我需要ajaxFunc等到MyAsyncListener得到一个特定的响应,然后返回这个确切的响应。 JS的一部分我注入到webview中: var response = jsHandler.ajaxFunc(request.data); 我有一个名为response的variables全局variables。 public class JavaScriptInterface { @JavascriptInterface public String ajaxFunc(String data) { return MyUtils.handleData( data ); } } handleData方法: public String handleData( String data ) { SomeClass.startAsyncRequest(); // starts the async request, response is to come at the listener's callbacks . […]

重新启动/暂停onResume / onPause中的线程

我有一个使用SurfaceView实现来显示对象的游戏。 我有一个线程绘制SurfaceView时间到屏幕。 游戏正在运行。 不幸的是,每当游戏中断时,都需要暂停function。 那么,我知道我需要操纵onResume和onPause 。 但是我不明白。 这个错误指出我已经回到了surfaceCreated ,在那里我开始线程告诉我线程已经启动了。 我尝试使用resume并suspend在onResume和onPause但没有任何改变。 我怎样才能做到这一点? 我已经完成了如何使用File-I / O处理来保存对象的位置。 提前致谢。

为WebTokenauthentication改装自定义客户端

我正在使用Retrofit来处理与服务器API,API用户JSON Web令牌进行身份validation的通信。 该令牌有时到期,我正在寻找实施改造客户端的最好方法,它可以在到期时自动刷新令牌。 这是我想到的初始实现,: /** * Client implementation that refreshes JSON WebToken automatically if * the response contains a 401 header, has there may be simultaneous calls to execute method * the refreshToken is synchronized to avoid multiple login calls. */ public class RefreshTokenClient extends OkClient { private static final int UNAUTHENTICATED = 401; /** […]

简单的方法来检测UI线程在Android上拖延?

我接pipe了一个来自过去员工的Android项目,并且想知道是否有一个简单的工具可用于分析Android应用程序。 我有一个LinearLayout的ProgressBar微调框内。 现在,我在一个不同的线程上运行一个networking调用,而微调显示。 我使用翻译animation来显示整个LinearLayout,当networking调用在另一个线程上返回时,我隐藏了LinearLayout。 现在这个效果很好,但是我看到,在显示的时候,旋转器停止旋转。 现在看来,如果我与屏幕交互,如试图滚动,微调将继续旋转。 对于一个标准的ProgressBar微调器,我需要在微调器上设置一些命令来保持它旋转? 任何有关这方面的信息将是伟大的。 谢谢

Android- Thread.join()导致应用程序挂起

我有一个线程处理我的游戏循环,当我调用此线程上的.join()应用程序停止响应。 我一直在试图解决一个问题,程序永远不会到达代码,IE线程永远不会结束。 System.out.println("YAY"); 我的游戏循环线程: 这个线程成功地打印出“游戏结束”,但似乎从来没有完成。 Runnable startGameLoop = new Runnable() {//game loop @Override public void run() { AiFactory ai = new AiFactory(); final Button play = (Button) findViewById(R.id.Play); final Button pass = (Button) findViewById(R.id.Pass); while(finish==false){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } currentPlayer = game.getPlayer(); if(currentPlayer.isPlayer()==false){ //System.out.println("passCount:" +game.getPasscount()); ai.decide(nextPlay, game.getPreviousPlayed(), currentPlayer, game.getPasscount() […]

在Android UI线程上花费大量的计算

我的Android应用程序使用了一个特别大的计算,使系统崩溃,因为它在Activity中的UI线程上。 我对multithreading没有多less信心,所以我想获得一些关于如何正确执行的提示。 这是我的 class ActivtyName extends Activity{ boolean threadcomplete = false; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //stuff Runnable newthread = new Runnable(){ @Override public void run() { doBigComputation(); threadcomplete=true; } }; newthread.run(); boolean b = true; while(b){ if(threadcomplete){ b=false; startTheApp(); } } } } 现在,我很确定我所做的不是“正确的”。 (这似乎工作,系统不会崩溃)。 基本上,我不知道如何可以告诉UI线程没有这个布尔,线程完成newthread已经完成计算。 有没有一个“正确”的方式来做到这一点?