2

アクティビティでasynctaskを使用してコードを記述しました。ただし、別のJavaファイルに記述されたサービスクラスで同じコードを再利用する必要があります。両方で使用できるように、コードを別のJavaファイルに書き込もうとしました。しかし、それは非同期タスクではうまくいきませんでした。そうする方法はありますか?もしあれば、それのチュートリアルを提供してください。ありがとう。コードは次のようになります。

MainActivity.java

//import java.util.Calendar;

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.AlarmManager;
import android.app.ListActivity;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListAdapter;
import android.widget.SimpleAdapter;

public class AndroidJSONParsingActivity extends ListActivity {

    protected static final String TAG_PRODUCTS = "products";
    protected static final String TAG_CID = "cid";
    public static final String TAG_NAME = "name";

    JSONArray products = null;
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
    public static String url = "http://ensignweb.com/sandbox/app/comment11.php";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startService(new Intent(this, UpdateService.class));
        new Messages().execute();
        Intent intent = new Intent(this,UpdateService.class);
        PendingIntent pIntent = PendingIntent.getService(this, 0, intent, 0);
        AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 30000, pIntent);        

    }

@Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        new Messages().execute();
    }
    //Belongs to update service
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
//      stopService(new Intent(this, UpdateService.class));
    }

    class Messages extends AsyncTask<Void, Void, Void> {
        ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
        ProgressDialog dialog = null;
        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

            dialog.setTitle("Progressing");
            dialog.setMessage("be patient");
            JSONParser JSP = new JSONParser();
            JSONObject json = JSP.getJSONFromUrl(url);

            try{
                products = json.getJSONArray(TAG_PRODUCTS);
                for(int i = products.length()-1; i >=0; i--){
                    JSONObject c = products.getJSONObject(i);

                    // Storing each json item in variable
                    String cid = c.getString(TAG_CID);
                    String name = c.getString(TAG_NAME);
                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    map.put(TAG_CID, cid);
                    map.put(TAG_NAME, name);

                    // adding HashList to ArrayList
                    contactList.add(map);
                    Log.d("value", contactList.toString());
                }
        }catch(JSONException e){
            e.printStackTrace();
        }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub

            super.onPostExecute(result);
//          dialog.dismiss();
            ListAdapter adapter = new SimpleAdapter(AndroidJSONParsingActivity.this, contactList,
                    R.layout.list_item,
                    new String[] { TAG_NAME,}, new int[] {
                            R.id.name});
            AndroidJSONParsingActivity.this.setListAdapter(adapter);
        }
    }   
}
4

2 に答える 2

1

なぜサービスのために が必要なのかわかりませんAsyncTask。ただし、それを行うことはできますが、他のアクティビティから実行されている間に実行しようとしていないことを確認する必要があります。また、同じタイプのパラメーターを送信する必要があります。一般に、それを必要とするさまざまなクラスに対して個別のタスクを作成する方が適切ですが、それは機能します。安全のために、アクティビティを破棄cancel()するAsyncTaskときに を呼び出して、他のクラスから呼び出したときに実行されていないことを確認する必要があります。それ以外では、 のコードとAsyncTask、両方のクラスからそれを呼び出す方法を確認する必要があります。

編集

アクティビティから拡張AyncTaskして呼び出す別のクラスを作成できます。内部クラスの良いところは、メンバー変数にアクセスできることです。あなたが抱えている別の問題は、progressBarから更新しようとすることですdoInBackground()。そこからを操作することはできませんUI。ただし、他の 3 つのAsyncTask方法 ( onProgressUpdate()onPostExecute()、およびonPreExecute()) から実行できます。

用の別のクラス ファイルをAsyncTask作成するには、コンテキストを受け入れるコンストラクタを作成して、Activity UI

Public class MyAsyncTask extends AsyncTask
{

private Context context; 

public MyAsyncTask(Context context) {
    this.context = context;
}

// Add your AsyncTask methods and logic
//you can use your context variable in onPostExecute() to manipulate activity UI
}`
于 2013-01-10T06:26:55.053 に答える
0

サービスでasynchTaskを使用する必要はありません。この作業は、intentServiceを介して実行できます。

アプリケーションのメインスレッドとは別に、onStartCommand()に配信されるすべてのインテントを実行するデフォルトのワーカースレッドを作成します。

        public class HelloIntentService extends IntentService {

  /** 
 * A constructor is required, and must call the super IntentService(String)
  * constructor with a name for the worker thread.
 */
  public HelloIntentService() {
     super("HelloIntentService");
   }

  /**
   * The IntentService calls this method from the default worker thread with
   * the intent that started the service. When this method returns, IntentService
  * stops the service, as appropriate.
   */
 @Override
  protected void onHandleIntent(Intent intent) {
  // Normally we would do some work here, like download a file.
  // For our sample, we just sleep for 5 seconds.
  long endTime = System.currentTimeMillis() + 5*1000;
  while (System.currentTimeMillis() < endTime) {
      synchronized (this) {
          try {
              wait(endTime - System.currentTimeMillis());
          } catch (Exception e) {
          }
      }
  }
 }
}

これがリファレンスです、 http://developer.android.com/guide/components/services.html

于 2013-01-10T06:39:34.880 に答える