这是问题,在此之前我将所有代码放在onCreate();但加载时间超过10秒,显示空白屏幕直到屏幕满载。所以我把一些代码移到了doInBackground。但我面临一些在onCreate()下永远不会发生的问题,让我们现在看看代码:
String photoURL1;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.app_details);
tvDescription = (TextView)findViewById(R.id.tvDescription);
tvTitle = (TextView)findViewById(R.id.tvTitle);
tvDeveloper = (TextView)findViewById(R.id.tvDeveloper);
rbRating = (RatingBar)findViewById(R.id.rbRating);
ivLogo = (ImageView)findViewById(R.id.ivLogo);
ivPhoto1 = (ImageView)findViewById(R.id.ivPhoto1);
ivPhoto2 = (ImageView)findViewById(R.id.ivPhoto2);
ivPhoto3 = (ImageView)findViewById(R.id.ivPhoto3);
new loadPage().execute(null, null, null);
}
public class loadPage extends AsyncTask<String, Integer, Void> {
private ProgressDialog pdia;
@Override
protected void onPreExecute(){
super.onPreExecute();
pdia = new ProgressDialog(AppDetails.this);
pdia.setMessage("Loading...");
pdia.show();
}
@Override
protected Void doInBackground(String... aurl) {
SoapObject Request = new SoapObject (NAMESPACE, METHOD_NAME);
Request.addProperty("title", getIntent().getExtras().getString("xdaTitle"));
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet = true;
soapEnvelope.setOutputSoapObject(Request);
AndroidHttpTransport aht = new AndroidHttpTransport(URL);
try
{
aht.call(SOAP_ACTION, soapEnvelope);
SoapObject resultString = (SoapObject) soapEnvelope.getResponse();
for(int i =0; i<resultString.getPropertyCount(); i++)
{
SoapObject array = (SoapObject) resultString .getProperty(i);
title = array.getProperty(1).toString();
developer = array.getProperty(3).toString();
//load images
photoURL1 = array.getProperty(5).toString(); //get logo url
BitmapFactory.Options bmOptions;
bmOptions = new BitmapFactory.Options();
bmOptions.inSampleSize = 1;
}
}
catch(Exception e){
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress2) {
}
@Override
protected void onPostExecute(Void unused) {
tvTitle.setText(title);
tvDeveloper.setText(developer);
BitmapFactory.Options bmOptions;
bmOptions = new BitmapFactory.Options();
bmOptions.inSampleSize = 1;
Bitmap bmLogo = LoadImage(photoURL1, bmOptions);
ivLogo.setImageBitmap(bmLogo);
pdia.dismiss();
}
这是问题所在。
=======更新:我应该在哪里停放此代码? =================
MyI = new Intent(Intent.ACTION_VIEW);
MyI.setAction(android.content.Intent.ACTION_VIEW);
MyI.setDataAndType(Uri.parse("file:///sdcard/MaxApps/" + apkURL.toString()), "application/vnd.android.package-archive");
MyPI = PendingIntent.getActivity(getApplicationContext(), 0, MyI, 0);
MyNM = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent(getApplicationContext(), AppDetails.class);
intent.putExtra("xdaTitle", title);
final PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
notification = new Notification(R.drawable.logo, "Downloading...", System.currentTimeMillis());
notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
notification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.downloadapk);
notification.contentIntent = pendingIntent;
notification.contentView.setImageViewResource(R.id.imgIcon, R.drawable.save);
notification.contentView.setTextViewText(R.id.tvText, "Downloading " + apkURL);
notification.contentView.setViewVisibility(R.id.pbStatus, View.VISIBLE);
notification.contentView.setProgressBar(R.id.pbStatus, 100, progress, false);
notificationManager = (NotificationManager) getApplicationContext().getSystemService(getApplicationContext().NOTIFICATION_SERVICE);
答案 0 :(得分:2)
实际上,
ivLogo.setImageBitmap(bmLogo);
ivPhoto1.setImageBitmap(bmPhoto1);
ivPhoto2.setImageBitmap(bmPhoto2);
ivPhoto3.setImageBitmap(bmPhoto3);
doInBackground()
中的这些行会导致问题。因为您正在尝试从工作线程(非UI线程)更新MainUI线程。
您无法从doInBackground()
的{{1}}更新 MainUI ,因此最好将此更新代码放在AsyncTask
的{{1}}中。
答案 1 :(得分:1)
您无法在后台线程中更改UI。
AsyncTask有一个更好的选项来在下载时更新UI,即使用publishProgress()
您需要对代码进行一些更改才能实现它。
@Override
protected Void doInBackground(String... aurl) {
for(int i =0; i<resultString.getPropertyCount(); i++)
{
String logo_URL = array.getProperty(5).toString(); //get logo url
bmLogo = LoadImage(logo_URL, bmOptions);
String photo1_URL = array.getProperty(6).toString();
bmPhoto1 = LoadImage(photo1_URL, bmOptions);
String photo2_URL = array.getProperty(7).toString();
bmPhoto2 = LoadImage(photo2_URL, bmOptions);
String photo3_URL = array.getProperty(8).toString();
bmPhoto3 = LoadImage(photo3_URL, bmOptions);
publishProgress(null);
}
}
catch(Exception e){
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress2) {
ivLogo.setImageBitmap(bmLogo);
ivPhoto1.setImageBitmap(bmPhoto1);
ivPhoto2.setImageBitmap(bmPhoto2);
ivPhoto3.setImageBitmap(bmPhoto3);
}