2013-04-22 43 views
8

我正在做一些動手閱讀AsyncTaskLoader,因此我可以使用該技術來加載聯繫人列表。代碼工作的唯一時間是當我執行Fragment類中的回調時,如MyLoader extends Fragment implements LoaderCallbacks<ArrayList<Contact>>中的回調。有另一種方法嗎?我真正需要的是聯繫人列表(姓名,電話,縮略圖),發送到我的後端。例如,當我嘗試使用Context時,由於我可以通過簡單地做(Context)this從任何活動中獲得該代碼,所以代碼甚至無法編譯。我的意思是使用LoaderCallbacks而不使用片段

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. 

順便說一句:我使用多個引用。一個是http://developer.android.com/reference/android/content/AsyncTaskLoader.html

問題(再次):我可以使用AsyncTaskLoader沒有片段或FragmentActivity?

THAT與該片作品CODE:

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

} 

清單:

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="16" /> 
+0

@bossylobster,我一直在試圖迴應這一個,但我沒有開它。任何輸入?你的同事呢?得到我的是8級的api部分。它確實可以與片段一起工作,但顯然沒有其他的東西(請參考wangyif2的回覆中的討論)。 – 2013-04-22 20:30:31

回答

7

AsyncTaskLoader無關與您是否使用FragmentActivity

給你舉一個例子,考慮清單活動:

public class ExampleActivity extends ListActivity implements 
LoaderManager.LoaderCallbacks<Cursor> { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.todo_list); 

     //to start the loader: 
     getLoaderManager().initLoader(0, null, this); 
    } 

    //override the loader callback methods as usual 
    // Creates a new loader after the initLoader() call 
    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     CursorLoader cursorLoader = new CursorLoader(this, 
     uri, projection, null, null, null); 
     return cursorLoader; 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     adapter.swapCursor(data); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     // data is not available anymore, delete reference 
     adapter.swapCursor(null); 
    } 
} 

顯然,你需要創建列表視圖和佈局相應的適配器,但例如只是展示瞭如何對光標的一個簡單的裝載機將工作爲一個活動。

此外,請確保您所有的進口是一致的,無論是使用support.v4庫,或定期庫:

import android.app.LoaderManager; 
import android.content.CursorLoader; 
import android.content.Loader; 

被問另外一個問題,就是如果LoaderCallback接口,可獨立使用。如果您認爲LoaderCallback適用於此,則不推薦這樣做。

The LoaderManager.LoaderCallbacks<D> interface is a simple contract that the LoaderManager uses to report data back to the client.這意味着什麼,是它唯一的工作是由客戶端,這是有效的,活動要求後臺加載一些數據。

如果您創建獨立類,您可以擴展類定義以實現LoaderManager.LoaderCallbacks<D>,但您需要通過某種機制將加載的數據報告回原始活動,這會使一個簡單的任務複雜化。

現在,如果你真的固定在這樣做,你可以創建獨立的類像這樣:

public class LoadingContacts implements LoaderManager.LoaderCallbacks<Cursor> { 
@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    return null; 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
} 
} 

在你onLoadFinished方法,則需要通過無論是廣播加載Cursor發回,或某種消息總線:

  • LocalBroadcastManager
  • Otto
  • Messenger

後您發送此信息的MainActivity,你可以將它裝入適配器和繼續是。

+1

非常感謝您的回覆:+1。我現在添加了與Fragment和FragmentActivity配合使用的代碼。如果'LoadingContacts'沒有父活動(例如Fragment)和'MainActivity'沒有擴展FragmentActivity,你是否介意將它編輯成你的答案以顯示它的工作方式? – learner 2013-04-22 17:37:10

+2

讓我明白你的問題,你想要一個'MainActivity'來擴展Activity和LoadContacts是純粹的加載器而不是'Activity'或'Fragment'? – wangyif2 2013-04-22 17:40:10

+3

我很好奇,看看這會如何工作。 – 2013-04-22 17:40:56