Java 异步任务完成后如何更改ActionBar的颜色?
在我的应用程序中,我正在连接到WebView的Java 异步任务完成后如何更改ActionBar的颜色?,java,android,android-asynctask,Java,Android,Android Asynctask,在我的应用程序中,我正在连接到WebView的onPageFinished中执行AsyncTask。此方法如下所示: @Override public void onPageFinished(WebView myWebView, String url) { new SendRequestAsyncTask().execute(); // when a page has finished loading dismiss any progress dialog if (pr
onPageFinished
中执行AsyncTask
。此方法如下所示:
@Override
public void onPageFinished(WebView myWebView, String url)
{
new SendRequestAsyncTask().execute();
// when a page has finished loading dismiss any progress dialog
if (progressDialog != null && progressDialog.isShowing())
{
progressDialog.dismiss();
}
}
public class SendRequestAsyncTask extends AsyncTask <Void, Void, Void> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
//runs in ui thread
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("myscript.php");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("request", "12345"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
// writing response to log
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
String responseStr = EntityUtils.toString(resEntity).trim();
Log.v(TAG, "Response: " + responseStr);
String[] parts = responseStr.split(":");
parts[1] = parts[1].replace("\"", "");
parts[1] = parts[1].replace("}", "");
if (parts[1].equals("01")){
actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#ffffff")));
} else {
Log.v(TAG, "No success: " + parts[1]);
}
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
//runs in ui thread you can update the layout here
}
}
而SendRequestAsyncTask
看起来是这样的:
@Override
public void onPageFinished(WebView myWebView, String url)
{
new SendRequestAsyncTask().execute();
// when a page has finished loading dismiss any progress dialog
if (progressDialog != null && progressDialog.isShowing())
{
progressDialog.dismiss();
}
}
public class SendRequestAsyncTask extends AsyncTask <Void, Void, Void> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
//runs in ui thread
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("myscript.php");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("request", "12345"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
// writing response to log
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
String responseStr = EntityUtils.toString(resEntity).trim();
Log.v(TAG, "Response: " + responseStr);
String[] parts = responseStr.split(":");
parts[1] = parts[1].replace("\"", "");
parts[1] = parts[1].replace("}", "");
if (parts[1].equals("01")){
actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#ffffff")));
} else {
Log.v(TAG, "No success: " + parts[1]);
}
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
//runs in ui thread you can update the layout here
}
}
公共类SendRequestAsyncTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
//在ui线程中运行
}
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost=newhttppost(“myscript.php”);
试一试{
//添加您的数据
List nameValuePairs=新的ArrayList(2);
添加(新的BasicNameValuePair(“请求”、“12345”);
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
//执行HTTP Post请求
HttpResponse response=httpclient.execute(httppost);
//将响应写入日志
HttpEntity当前性=response.getEntity();
if(最近性!=null){
String responsest=EntityUtils.toString(resEntity.trim();
Log.v(标签,“响应:+responsest”);
String[]parts=responsest.split(“:”);
零件[1]=零件[1]。替换(“\”,“);
零件[1]=零件[1]。替换(“}”和“);
如果(第[1]部分等于(“01”)){
actionBar.setBackgroundDrawable(新的ColorDrawable(Color.parseColor(“#ffffffff”));
}否则{
Log.v(标签“未成功:+部分[1]);
}
}
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
}捕获(IOE异常){
//TODO自动生成的捕捉块
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
//在ui线程中运行您可以在此处更新布局
}
}
但是,这会使我的应用程序崩溃。因此,我猜我需要在
onPageFinished
方法中更改Actionbar的颜色。但是,我真的不知道如何将变量从AsyncTask
获取到onPageFinished
。此外,我不知道如何将颜色从@color/
xmlf更改为颜色ile…不,您需要在onPostExecute中设置颜色。这在UI线程上,可以安全地触摸UI。只要将调用移动到那里,您就应该停止崩溃。当然,您可能需要将一些数据传递到onPostExecute才能正确执行(或者将其存储在AsyncTask的类变量中)。尝试类似的方法
public class SendRequestAsyncTask extends AsyncTask <Void, String, String> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
//runs in ui thread
}
@Override
protected String doInBackground(Void... params) {
// TODO Auto-generated method stub
String strReturn = "";
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("myscript.php");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("request", "12345"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
// writing response to log
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
String responseStr = EntityUtils.toString(resEntity).trim();
Log.v(TAG, "Response: " + responseStr);
String[] parts = responseStr.split(":");
parts[1] = parts[1].replace("\"", "");
parts[1] = parts[1].replace("}", "");
strReturn = parts[1];
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
return strReturn;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
//runs in ui thread you can update the layout here
if (result.equals("01")){
actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#ffffff")));
} else {
Log.v(TAG, "No success: " + parts[1]);
}
}
}
公共类SendRequestAsyncTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
super.onPreExecute();
//在ui线程中运行
}
@凌驾
受保护字符串doInBackground(无效…参数){
//TODO自动生成的方法存根
字符串strReturn=“”;
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost=newhttppost(“myscript.php”);
试一试{
//添加您的数据
List nameValuePairs=新的ArrayList(2);
添加(新的BasicNameValuePair(“请求”、“12345”);
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
//执行HTTP Post请求
HttpResponse response=httpclient.execute(httppost);
//将响应写入日志
HttpEntity当前性=response.getEntity();
if(最近性!=null){
String responsest=EntityUtils.toString(resEntity.trim();
Log.v(标签,“响应:+responsest”);
String[]parts=responsest.split(“:”);
零件[1]=零件[1]。替换(“\”,“);
零件[1]=零件[1]。替换(“}”和“);
strReturn=零件[1];
}
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
}捕获(IOE异常){
//TODO自动生成的捕捉块
}
返回strReturn;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
//在ui线程中运行您可以在此处更新布局
如果(结果等于(“01”)){
actionBar.setBackgroundDrawable(新的ColorDrawable(Color.parseColor(“#ffffffff”));
}否则{
Log.v(标签“未成功:+部分[1]);
}
}
}
确实有道理,我如何将数据正确地传递给onPostExecute?从doInBackground返回的值被传递到onPostExecute。