之前我问过这个问题,但是我打算用一个解决方案来完成这个问题并提出另一个问题.
我正在使用这个类来创建异步WebRequest:
class HttpSocket
{
public static void MakeRequest(Uri uri, Action<RequestCallbackState> responseCallback)
{
WebRequest request = WebRequest.Create(uri);
request.Proxy = null;
Task<WebResponse> asyncTask = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
ThreadPool.RegisterWaitForSingleObject((asyncTask as IAsyncResult).AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), request, 1000, true);
asyncTask.ContinueWith(task =>
{
WebResponse response = task.Result;
Stream responseStream = response.GetResponseStream();
responseCallback(new RequestCallbackState(response.GetResponseStream()));
responseStream.Close();
response.Close();
});
}
private static void TimeoutCallback(object state, bool timedOut)
{
Console.WriteLine("Timeout: " + timedOut);
if (timedOut)
{
Console.WriteLine("Timeout");
WebRequest request = (WebRequest)state;
if (state != null)
{
request.Abort();
} …Run Code Online (Sandbox Code Playgroud) 在我的应用程序初始化期间,我有一个任务需要大约10秒的UI线程,我决定把它放在后台线程中,并显示一个启动画面,而这正在进行..我使用AsyncTask ...但是由于AsyncTasks优先级被硬编码得如此之低,并且无法增加它我能找到的任务,任务从花费10秒钟完成到几分钟.
所以,我的问题是,如何在没有AsyncTask的情况下在NON UI线程上运行任务?到目前为止,我尝试过的所有内容似乎都在UI任务上运行,这会阻止SplashScreen在任务完成之后出现.
那么如何创建一个线程,在非UI线程上运行呢?我假设除了AsyncTask之外必须有一个选项,但到目前为止我还没有找到它......处理程序似乎只是在UI上运行,标准线程/ runnables也是如此.这必须是可能的,但我只是没有搞清楚.
在回调中,NetworkStream.BeginRead我似乎注意到始终读取所有字节。我看到许多教程检查BytesRead是否小于总字节,如果是,请再次读取,但是似乎从来没有。
if (bytesRead < totalBytes)即使一次发送大量数据(数千个字符),并且即使缓冲区大小设置为非常小的值(大约16个),该条件也永远不会触发。
我没有使用“老式方式”进行测试,因为我正在使用Task.Factory.FromAsync而不是调用NetworkStream.BeginRead并提供一个我称为EndRead的回调。也许Tasks自动包含了直到读取完所有数据才返回的功能?我不确定。
无论哪种方式,我仍然对何时不能一次读取所有数据感到好奇。甚至需要检查是否未读取所有数据,如果需要,则再次读取?我似乎无法获得有条件运行的条件。
谢谢。
我的主要AsyncTasks之一似乎偶尔会崩溃(进度条冻结并且进程停止)我想知道我的代码中是否有错误.
看起来当我的Galaxy S2开始耗尽电量时可能会发生这种情况 - 这似乎与亮度控制方面的一些错误相吻合.虽然这些是错误的原因还是由错误导致的,但我还是无法确定.此外,由于电池似乎总是低电量,这可能甚至没有关联!
我在AsyncTask中做的任何事情是错的吗?我实际上只是在使用处理程序执行实际计算机之前,使用AsyncTask显示三个进度条中的一个(计算机播放器).
这也是Android市场上从未报道过的.如果它是由InterruptedException引起的,我是否还应该打印堆栈跟踪,以便在我的最终用户发生用户时出现错误?
//Declaration at top level of activity
private ComputerPlayerTask mComputerPlayerTask = new ComputerPlayerTask();
// Execution of the task with a random integer value
mComputerPlayerTask = new ComputerPlayerTask();
mComputerPlayerTask.execute(randomInt);
private class ComputerPlayerTask extends
AsyncTask<Integer, Integer, Boolean> {
private ProgressBar mProgressBar;
@Override
protected Boolean doInBackground(Integer... params) {
int delayTime = params[0];
mProgressBar.setMax(delayTime - 1);
for (int i = 0; i < delayTime; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Log.e(DEBUG_TAG, "Can't sleep thread"); …Run Code Online (Sandbox Code Playgroud) 我有一个在AsyncTask中运行的ProgressDialog.我试图实现,只要缓冲区的长度更大,然后说10000,来自ProgressDialog的消息就会发生变化.
有人可以帮帮我吗,这可能吗?先感谢您.
@Override
protected void onProgressUpdate(Integer... progUpdate) {
if (progUpdate[0] >= 10000){
progress.setMessage("Informatie wordt opgehaald....");
}
}
Run Code Online (Sandbox Code Playgroud)
缓冲区是在AsyncTask doInBackGround中创建的:
try {
HttpResponse response = httpClient.execute(request);
System.out.println("Response: " + response.getEntity().getContentLength());
/******* READ CONTENT IN BUFFER *******/
InputStream inputStreamActivity = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStreamActivity));
StringBuilder sb = new StringBuilder();
String line = null;
int count = sb.length();
while ((line = reader.readLine()) != null) {
sb.append(line);
publishProgress(sb.length());
}
/******* CLOSE CONNECTION AND STREAM *******/
System.out.println(sb);
inputStreamActivity.close();
kpn = sb.toString();
httpClient.getConnectionManager().shutdown(); …Run Code Online (Sandbox Code Playgroud) 我有一个启动画面,如果服务器上有任何新内容,则会检查URL.如果show我希望向app用户显示一个AlertDialog,以便取决于用户的操作,即如果YES从服务器下载新内容并将其送到数据库,否则如果NO从服务器加载应用程序的内容.
但是,我无法在AsyncTask中使用警报对话框我的代码段如下:
protected String doInBackground(String... mode){
/* I AM QUERY MY DATABASE FOR THE PREVIOUS CONTENT(SAY CONTENT 1, CONTENT 2);
* then i start my connection to the server which has an xml file with the content
* info (say content 3), at this stage .
* i Check certain condition here,
* say if result ==0 then i wish to display an alertdialog.
* I used an alert dialog and i get some error. Stating use Looper or Handler. …Run Code Online (Sandbox Code Playgroud)
这是应该执行某些操作的代码的一部分,然后调用onPostExecute事件.
出于某种原因,它没有调用它,并且在eclipse中我可以看到该方法用黄色标记(未使用的方法)...
我无法理解为什么这样...
你知道为什么吗?
谢谢!
PS:我在这里看了一些帖子,没找到我的解决方案......
final ImageButton sync = (ImageButton) findViewById(R.id.syncChanges);
sync.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sync.setImageResource(R.drawable.none);
sync.setBackgroundResource(R.drawable.animation);
final AnimationDrawable frameAnimation = (AnimationDrawable) sync.getBackground();
frameAnimation.start();
class DownloadFilesTask extends AsyncTask<String, Void, String[]> {
protected String[] doInBackground(String...strings) {
try {
OptionScraper.run(strings[0], Integer.parseInt(strings[1]));
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,每60秒我从网站获得更新.我在后台使用a获取此更新AsyncTask.这是我的代码:
update = new Timer();
update.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
updateItems();
}
});
}
}, 30000, 60000);
Run Code Online (Sandbox Code Playgroud)
其中updateItems()方法是:
public void updateItems() {
System.out.println("Every 60 sec getItems");
new DownloadTask().execute();
}
Run Code Online (Sandbox Code Playgroud)
public class DownloadTask extends AsyncTask<Void, Void, Void> {
protected void onPostExecute(Void... args) {
System.out.println("Download finished");
}
protected Void doInBackground(Void... args) {
try {
UpdateItems();
} catch (Exception e1) {
e1.printStackTrace();
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
在UpdateItems() …
我将值传递给另一个活动,但始终为null值
public class SatelliteDirectActivity extends Activity {
private Intent intent;
private Bundle b;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
intent = new Intent(SatelliteDirectActivity.this,ClsMainActivitySatelliteDirect.class);
b = new Bundle();
setContentView(R.layout.initial_splash_screen);
boolean bCheckInternetConnectivity = checkInternetConnection();
if(!bCheckInternetConnectivity)
{
Toast.makeText(this, "Please ensure that you have a internet connectivity", Toast.LENGTH_SHORT);
finish();
}
else
{
new GetCountryInformation().execute();
}
startActivity(intent);
finish();
}
private boolean checkInternetConnection() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// test for connection
if (cm.getActiveNetworkInfo() != …Run Code Online (Sandbox Code Playgroud) 当我更新我的数据库时,我想显示一个进度对话框.我的问题是ProgressDialog出现迟到了,在4-5秒之后,然后出现并且消失的速度非常快,它在屏幕上几毫秒几乎看不到它,然后立即在列表中显示新数据.这让我觉得ProgressDialog正在等待数据库更新(它不需要花费太多,大约4.5秒)然后它会在屏幕上显示但是很快就会消失.我想立即显示ProgressDialog我按下"更新"按钮并在屏幕上停留4-5秒.
class MyAsyncTask extends AsyncTask<Void, Void, Void>{
ProgressDialog myprogsdial;
@Override
protected void onPreExecute(){
myprogsdial = ProgressDialog.show(MyActivity.this, null, "Upgrade", true);
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
RefreshDataBase();
}
});
return null;
}
@Override
protected void onPostExecute(Void result){
myprogsdial.dismiss();
}
}
Run Code Online (Sandbox Code Playgroud)
我打电话的时候 new MyAsyncTask().execute();