正确使用AsyncTask get()

时间:2013-04-15 03:13:24

标签: android android-asynctask

我遇到了问题。我需要使用asynctask来检索JSON数据,在移动到程序的下一部分之前我需要这些数据。但是,当我使用AsyncTask的get()方法时,在看到数据显示之前,我有5到8秒的黑屏。我想在数据检索期间显示进度对话框,但由于黑屏,我无法执行此操作。有没有办法放入另一个线程?这是一些代码

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

3 个答案:

答案 0 :(得分:11)

当您使用get时,使用Async Task没有任何意义。因为get()将阻止UI线程,所以如上所述,为什么面临3到5秒的空白屏幕。

不要使用get()代替使用AsyncTask和回拨来检查AsyncTask with callback interface

答案 1 :(得分:0)

AsyncTask.get()-> Future.get()

  

在必要时等待计算完成,然后检索其结果。

Java Future代表异步任务的结果。

调用方法get()会阻塞当前线程,并等到可调用对象完成后再返回实际结果

您可以在单独的线程中调用get()并根据您的体系结构构建逻辑。

呼叫get()可能会花费大量时间。您可以采用两种方法来代替浪费时间:

  • 也使用AsyncTask.get(long timeout, TimeUnit unit)-> Future.get(long timeout, TimeUnit unit),但是将超时值设置为参数,可以防止出现问题时卡住。

  • 使用isDone()方法,它可以快速查看Future并检查其是否已完成工作。

了解更多here

答案 2 :(得分:0)

AsyncTask.get()-> Future.get()

  

在必要时等待计算完成,然后检索其结果。

Java Future代表异步任务的结果。

调用方法get()会阻塞当前线程,并等到可调用对象完成后再返回实际结果

您可以在单独的线程中调用get()并根据您的体系结构构建逻辑。

还可以看看:

  • AsyncTask.get(long timeout, TimeUnit unit) -> Future.get(long timeout, TimeUnit unit)

  • isDone()方法,以检查未来是否完成