2014-06-27 71 views
0

在我的应用程序中,我正在执行AsyncTask连接到WebView的onPageFinished。这种方法看起来是这样的:如何在AsyncTask后更改ActionBar颜色?

@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(); 
    } 
} 

而且SendRequestAsyncTask看起来是这样的:

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 
    } 
} 

然而,这种崩溃我的应用程序。所以我的猜测是,我需要在onPageFinished方法中更改操作栏的颜色。但是,我不知道如何从AsyncTaskonPageFinished获取变量。此外,我不知道如何将颜色从@color/ xml文件更改为颜色...

回答

1

尝试这样的事情,

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]); 
    } 
} 
} 
1

不,您需要设置onPostExecute中的颜色。这是在UI线程上,可以安全地触摸UI。只需在那里打电话,你应该停止崩溃。您可能需要将一些数据传递给onPostExecute,以便正确执行此操作(或将其存储在AsyncTask的类变量中)。

+0

确实有道理,我怎么能正确地传递数据onPostExecute? – user3740505

+0

从doInBackground返回的值传入onPostExecute。 –