Tôi đang thực hiện một số đọc thực hành trên AsyncTaskLoader để tôi có thể sử dụng kỹ thuật này để tải danh sách liên lạc. Lần duy nhất mã hoạt động là khi tôi triển khai cuộc gọi lại từ một lớp mở rộng Fragment
như trong MyLoader extends Fragment implements LoaderCallbacks<ArrayList<Contact>>
. Có cách nào khác không? Tất cả những gì tôi thực sự cần là danh sách liên lạc (tên, điện thoại, hình thu nhỏ), để gửi tới chương trình phụ trợ của tôi. Khi, ví dụ, tôi cố gắng sử dụng Context
, vì tôi có thể nhận được điều đó từ bất kỳ hoạt động nào đơn giản bằng cách thực hiện (Context)this
, mã không thể biên dịch được. Theo ngữ cảnh, tôi có nghĩa làSử dụng LoaderCallbacks mà không cần Fragment
context.getLoaderManager().initLoader(1, null, this);
//I already changed to Fragment so don't really remember the exact ".context" line.
//But someone who has done this will understand the snippet.
BTW: Tôi đang sử dụng nhiều tài liệu tham khảo. Một là http://developer.android.com/reference/android/content/AsyncTaskLoader.html.
CÂU HỎI (một lần nữa): Tôi có thể sử dụng AsyncTaskLoader mà không có Fragment hoặc FragmentActivity không?
BỘ LUẬT làm việc với đoạn:
package com.example.contactpreload.utils;
import java.util.ArrayList;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
public class LoadingContacts extends Fragment implements LoaderCallbacks<ArrayList<Contact>> {
ArrayList<Contact> loadedContacts;
static Fragment fragmentActivity;
public static LoadingContacts newInstance(int arg) {
LoadingContacts f = new LoadingContacts();
Bundle bundle = new Bundle();
bundle.putInt("index", arg);
f.setArguments(bundle);
fragmentActivity = new Fragment();
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("onCreate()");
int mIndex = getArguments().getInt("index");
System.out.println(mIndex);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
System.out.println("onActivityCreated()");
getLoaderManager().initLoader(1, null, this);
}
@Override
public Loader<ArrayList<Contact>> onCreateLoader(int arg0, Bundle arg1) {
System.out.println("onCreateLoader()");
return new ContactsLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<ArrayList<Contact>> loader, ArrayList<Contact> data) {
loadedContacts = data;
System.out.println("AND THE CONTACTS ARE: ");
for (Contact c : loadedContacts) {
System.out.println("NAME: " + c.getName());
System.out.println("getPhoneNumberHome: " + c.getPhoneNumber());
}
}
@Override
public void onLoaderReset(Loader<ArrayList<Contact>> arg0) {
System.out.println("onLoaderReset()");
// TODO Auto-generated method stub
}
}
package com.example.contactpreload;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import com.example.contactpreload.utils.LoadingContacts;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LoadingContacts fragment = LoadingContacts.newInstance(1);
fragment.setRetainInstance(true);
getSupportFragmentManager().beginTransaction()
.add(android.R.id.content, fragment).commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
MANIFEST:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
@ bossylobster, tôi đã cố gắng trả lời câu hỏi này nhưng tôi không bẻ khóa. Bất kỳ đầu vào? Làm thế nào về các đồng nghiệp của bạn? Điều khiến tôi là phần api cấp 8. Nó thực sự làm việc với mảnh nhưng không có gì khác rõ ràng (ref các cuộc thảo luận dưới đây trong phản ứng của wangyif2). –