3

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

异步任务

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;

         }

}

显示信息

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

1 回答 1

11

当您使用get时,使用 Async Task 没有任何意义。因为get()会阻塞 UI 线程,这就是为什么你上面提到的要面对 3 到 5 秒的空白屏幕。

不要get()使用 AsyncTask 与 Call Back 检查此AsyncTask 与回调接口

于 2013-04-15T04:40:34.290 回答