0

AsyncTaskバックグラウンドで継続的にサーバーにデータを送信することが期待される を書いています。で呼び出しましonCreate()MainActivity。しかし、それは機能していません。トーストインonPreExecute()が表示され、何も起こりません。

private class MyAsync extends AsyncTask<Void, Void, Void>
 {
      @Override
      protected void onPreExecute() 
      {
          Toast.makeText(getApplicationContext(),"1", Toast.LENGTH_LONG).show();
            // update the UI immediately after the task is executed
            super.onPreExecute();
      }

          @Override
          protected Void doInBackground(Void... params)
          {
             // Toast.makeText(getApplicationContext(),"2", Toast.LENGTH_LONG).show();
              File file = new File(Environment.getExternalStorageDirectory(),"/BPCLTracker/gpsdata.txt");
              int i=0;

              RandomAccessFile in = null;

              try
              {
                  in = new RandomAccessFile(file, "rw");
              } 
              catch (FileNotFoundException e) 
              {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
              //String line =null;
              while (true) 
              {
                HttpEntity entity=null;
                try 
                {
                    if (new GPSLoggerService().isInternetOn()) 
                    {
                            while ((line = in.readLine()) != null)
                            {

                                HttpClient client = new DefaultHttpClient();
                                String url = "http://67.23.166.35:80/android/insert.php";
                                HttpPost request = new HttpPost(url);
                                StringEntity se = new StringEntity(line);
                                se.setContentEncoding("UTF-8");
                                se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                                entity = se;
                                request.setEntity(entity);
                                HttpResponse response = client.execute(request);
                                entity = response.getEntity();
                                i++;
                            }
                            if((line = in.readLine()) == null && entity!=null)
                            {
                                file.delete();
                                new MyAsync().execute();
                            }


                    }// end of if
                    else
                    {
                        Thread.sleep(60000);

                    } // end of else
                }// end of try
                catch (NullPointerException e1)
                {
                    e1.printStackTrace();
                } 
                catch (InterruptedException e2) 
                {
                    e2.printStackTrace();
                }
                catch (IOException e1) 
                {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }// end of while

      }//doinbackground

      @Override
      protected void onProgressUpdate(Void... values) {
         // Toast.makeText(getApplicationContext(),"3", Toast.LENGTH_LONG).show();
      }

      @Override
      protected void onPostExecute(Void result) {
          Toast.makeText(getApplicationContext(),"4", Toast.LENGTH_LONG).show();
      }

     }//AsyncTask

助けてください。ありがとうございました。

4

4 に答える 4

3

質問については、何が起こっているのかをもう少し具体的にする必要があります。ただし、この方法は望ましくありません。AsyncTask短期間の操作用です/ドキュメントによると

AsyncTasks は、理想的には短い操作 (せいぜい数秒) に使用する必要があります。スレッドを長時間実行し続ける必要がある場合は、次のような java.util.concurrent パッケージで提供されるさまざまな API を使用することを強くお勧めします。 Executor、ThreadPoolExecutor、および FutureTask。

while(true)めったに良い考えではない無限ループがあります。これを行う方法を再考することをお勧めします。TimerAlarmManager、またはを設定できますが、これServiceには使用しないことをお勧めしますAsyncTask

于 2013-03-20T12:50:50.140 に答える
1

利用サービスを利用することで、継続的にデータをアップロードすることができます。バックグラウンドで実行されるコードを提供し、サーバーにデータを継続的にアップロードします。

このサービスを呼び出すだけです:

startService(new Intent(this, BackgroundService.class));

また、Android マニフェスト ファイルにエントリを追加します

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;

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

import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class BackgroundService extends IntentService
{
    private static final String TAG = "BackgroundService";
    Context mContext = null;

    final static int SERVICE_NAME = 1;
    int WORK_TYPE;

    public BackgroundService()
    {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent)
    {

        mContext = getBaseContext();
        WORK_TYPE = SETTING;
        new BackgroundTask(mContext).execute();
    }

    public class BackgroundTask extends AsyncTask<String, String, Void>
    {
        Context mContext = null;

        public BackgroundTask(Context context)
        {
            mContext = context;
        }

        protected void onPreExecute()
        {
        }

        protected Void doInBackground(final String... args)
        {
            switch (WORK_TYPE)
            {
                case SETTING:
                String input = "what ever text data post on server";
                response = sendDataToServer(input);
                JsonUtils.parseServerData(response, hashMapObj);
                break;
            }
            return null;
        }

        protected void onPostExecute(final Void unused)
        {
            switch (WORK_TYPE)
            {
                case SETTING:
                    if (!"".equalsIgnoreCase(response) && response != null)
                    {
                        DeviceUtils.deviceRegistration(hashMapObj, mContext);   
                    }
                    callService(SERVICE_NAME);
                    break;
            }
        }
    }

    public void callService(int work)
    {
        WORK_TYPE = work;
        new BackgroundTask(mContext).execute();
    }


    public String sendDataToServer(String data)
    {
        StringBuffer sb = new StringBuffer("");
        String serverUrl = "http://67.23.166.35:80/android/insert.php" ;
        try
        {
            URL url = new URL();
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setConnectTimeout(6 * 10 * 1000);
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
            conn.setRequestMethod("POST");

            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(data);
            wr.flush();

            // Get the response
            BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            String line = "";
            while ((line = rd.readLine()) != null)
            {
                // Process line...
                sb.append(line);
            }

            wr.close();
            rd.close();
            return sb.toString();
        }
        catch (Exception e)
        {
            Log.d("Exception : ", e.getStackTrace().toString());
        }

        return sb.toString();
    }}
于 2013-03-20T17:28:59.683 に答える