[問題] progressBar+asyncTask(null reference)

作者: comteken ([CR])   2014-07-25 03:00:59
public class MorePhotoDialog extends DialogFragment {
private static final String TAG = "MorePhotoDialog";
private CustomAdapter _customAdapter;
private Context _context;
private ListView _listView;
private LinearLayout _linearLayout;
private ProgressBar _progressBar;
public MorePhotoDialog(Context context) {
Log.d(TAG, "new MorePhotoDialog");
_customAdapter = new CustomAdapter(context);
_context = context;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = getActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.custom_adapter, null);
_progressBar = (ProgressBar) view
.findViewById(R.id.custom_adapter_progressBar2);
_linearLayout = (LinearLayout) view
.findViewById(R.id.custom_adapter_progressLine);
_listView = (ListView) view.findViewById(R.id.custom_adapter_listView);
_listView.setAdapter(_customAdapter);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(view);
builder.setTitle(R.string.more_photo_dialog_more);
return builder.create();
}
int endFlag = 0;
public void addImageLoaderTask(String... urls) {
endFlag = urls.length - 1;
for (int i = 0; i < urls.length - 1; i++) {
ImageLoaderTask imageLoaderTask = new ImageLoaderTask(i);
Log.d(TAG, "imageLoaderTask.execute: " + urls[i]);
imageLoaderTask.execute(urls[i]);
}
}
// private class ImageLoaderTask extends AsyncTask<String, Void,
Bitmap[]> {
private class ImageLoaderTask extends AsyncTask<String, Void, Void> {
private int _flag = 0;
private ProgressBar progressBar;
public ImageLoaderTask(int flag) {
_flag = flag;
// progressBar = (ProgressBar)
getActivity().findViewById(R.id.custom_adapter_progressBar2);
}
@Override
protected void onPreExecute() {
// TODO progress bar
// Display progress bar
if (_flag == 0) {
_linearLayout.setVisibility(View.VISIBLE);
// progressBar.setVisibility(View.VISIBLE);
}
}
@Override
protected Void doInBackground(String... url) {
String imgUrl = url[0];
Log.w(TAG, "url[0] = " + url[0]);
// Getting Caching directory
File cacheDirectory = _context.getCacheDir();
// Temporary file to store the downloaded image
File tmpFile = new File(cacheDirectory.getPath(),
FunctionUtility.getLastString(imgUrl));
Log.d(TAG, "imgUrl(" + tmpFile.getName() + ") = " + imgUrl);
if (!tmpFile.exists()) {
Log.w(TAG, tmpFile.getPath() + " not exists");
BitmapFuntions.downloadBitmapFromUrl(imgUrl, tmpFile);
}
// Load bitmap and put in adapter
Bitmap bitmap = BitmapFuntions.decodeFile(tmpFile, 300, 200);
_customAdapter.addBitmap(bitmap);
// Show Logs
Log.d(TAG, "bitmap.getByteCount() = " + bitmap.getByteCount());
Log.d(TAG, tmpFile.getPath());
Log.d(TAG, tmpFile.getName() + " = " + tmpFile.length() / 1024
+ " Kb");
return null;
}
@Override
// protected void onPostExecute(Bitmap[] result) {
protected void onPostExecute(Void result) {
Log.d(TAG, "onPostExecute");
_customAdapter.notifyDataSetChanged();
if (_flag == endFlag) {
_linearLayout.setVisibility(View.GONE);
//progressBar.setVisibility(View.GONE);
}
}
}
}
呼叫dialogFragment的方法是
// Show MorePhotoDialog
MorePhotoDialog morePhotoDialog = new MorePhotoDialog(
Image_enlarge.this);
morePhotoDialog
.show(getSupportFragmentManager(), "morePhotoDialog");
morePhotoDialog.addImageLoaderTask(imglist);
可是會跑出NullPointerException
07-24 14:59:22.000: E/AndroidRuntime(7064): java.lang.NullPointerException:
Attempt to invoke virtual method 'void android.view.View.setVisibility(int)'
on a null object reference
07-24 14:59:22.000: E/AndroidRuntime(7064): at
com.gundam.cool.dialog.MorePhotoDialog$ImageLoaderTask.onPreExecute(MorePhotoDialog.java:96)
07-24 14:59:22.000: E/AndroidRuntime(7064): at
android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
07-24 14:59:22.000: E/AndroidRuntime(7064): at
android.os.AsyncTask.execute(AsyncTask.java:535)
不懂為什麼抓不到view...
作者: markzog21 (玉米)   2014-07-25 16:53:00
你把要顯示的view丟到asyncTask裡面去試試看要顯示dialog的view
作者: corrupt003 (QQ)   2014-07-25 20:07:00
你的activity的layout裡有view叫R.id.custom_adapter_progressBar2 嗎?alt + / 是找到R.java的所有資料…你還是要看activity的layout 有沒有訂義這個id,因為你是用getActivity去取得view的
作者: freesamael (燒賣)   2014-07-29 19:48:00
morePhotoDialog.show() 是 non-blocking call,FragmentManager 會排程到下一次 main thread 空閒時才把 DialogFragment 加到 activity。因此onCreateDialog() 被呼叫的時間會在addImageLoaderTask() 之後,此時 layout 還沒設定

Links booklink

Contact Us: admin [ a t ] ucptt.com