2013-04-15 27 views
2

我遇到了問題。我需要使用asynctask來檢索JSON數據,並且在移動到程序的下一部分之前我需要這些數據。但是,在使用AsyncTask的get()方法時,我看到數據顯示之前有5到8秒的黑屏。我想在數據檢索過程中顯示進度對話框,但由於黑屏,我無法做到這一點。有沒有辦法將其放入另一個線程?這裏是一些代碼正確使用AsyncTask get()

的AsyncTask

public class DataResponse extends AsyncTask<String, Integer, Data> { 

    AdverData delegate; 
    Data datas= new Data(); 
    Reader reader; 
    Context myContext; 
    ProgressDialog dialog; 
    String temp1; 

public DataResponse(Context appcontext) { 

    myContext=appcontext; 
    } 

@Override 
protected void onPreExecute() 
{ 
    dialog= new ProgressDialog(myContext); 
    dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    dialog.setCancelable(false); 
    dialog.setMessage("Retrieving..."); 
    dialog.show(); 
};  

    @Override 
    protected Data doInBackground(String... params) { 
     temp1=params[0];    
     try 
     { 
      InputStream source = retrieveStream(temp1); 
      reader = new InputStreamReader(source); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

      Gson gson= new Gson(); 
      datas= gson.fromJson(reader, Data.class);  


      return datas; 


    } 


    @Override 
    protected void onPostExecute(Data data) 
    { 

      if(dialog.isShowing()) 
      { 
       dialog.dismiss(); 
      } 

    } 



    private InputStream retrieveStream(String url) { 

      DefaultHttpClient client = new DefaultHttpClient(); 

      HttpGet getRequest = new HttpGet(url); 

      try { 

       HttpResponse getResponse = client.execute(getRequest); 
       final int statusCode = getResponse.getStatusLine().getStatusCode(); 

       if (statusCode != HttpStatus.SC_OK) { 
        Log.w(getClass().getSimpleName(), 
         "Error " + statusCode + " for URL " + url); 
        return null; 
       } 

       HttpEntity getResponseEntity = getResponse.getEntity(); 
       return getResponseEntity.getContent(); 

      } 
      catch (IOException e) { 
       getRequest.abort(); 
       Log.w(getClass().getSimpleName(), "Error for URL " + url, e); 
      } 

      return null; 

     } 

}

DisplayInfo

public class DisplayInfo extends Activity implements AdverData { 

public static Data data; 
public ProjectedData attup; 
public ProjectedData attdown; 
public ProjectedData sprintup; 
public ProjectedData sprintdown; 
public ProjectedData verizionup; 
public ProjectedData veriziondown; 
public ProjectedData tmobileup; 
public ProjectedData tmobiledown; 
public ProjectedAll transfer; 
private ProgressDialog dialog; 
public DataResponse dataR; 

Intent myIntent; // gets the previously created intent 
double x; // will return "x" 
double y; // will return "y" 
int spatial; // will return "spatial" 


//public static Context appContext; 

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

    StrictMode.ThreadPolicy policy = new StrictMode. 
      ThreadPolicy.Builder().permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 

    dialog= new ProgressDialog(DisplayInfo.this); 
    dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    dialog.setCancelable(false); 
    dialog.setMessage("Retrieving..."); 
    dialog.show(); 

     myIntent= getIntent(); // gets the previously created intent 
     x = myIntent.getDoubleExtra("x",0); // will return "x" 
     y = myIntent.getDoubleExtra("y", 0); // will return "y" 
     spatial= myIntent.getIntExtra("spatial", 0); // will return "spatial" 

     String URL = "Some URL" 






dataR=new DataResponse().execute(attUp).get(); 






@Override 
public void onStart() 
{more code} 
+1

嗯我沒有看到你的代碼只提的AsyncTask。只有doInBackground()的實現。根據定義,如果正確實施和使用,AsyncTasks將在後臺運行。如果你的程序需要等待AsyncTask的結果,那麼在等待的時候顯示一個對話框。 – dmon

+0

有沒有可以在該主題上發佈的代碼或鏈接。我非常感興趣。 – vaultzero

回答

6

當您使用get,使用異步任務沒有任何意義。因爲get()會阻塞UI線程,這就是爲什麼面對3到5秒的空白屏幕,如上所述。

不要使用get()改用的AsyncTask與回撥檢查這AsyncTask with callback interface

+0

因此,我已經完成了你所說的並設置了一個回調,但是當我使用該類時。它說它是空的 – vaultzero

+0

@vaultzero更新您的代碼 – Pragnani

+0

使用觀察者方法回調工作真的很好謝謝 – vaultzero