1

私はAndroidの初心者で、いくつかの情報をphpスクリプトに投稿するアプリを開発していますが、例外が多すぎます。

これが私のコードです:

 package com.example.testapp;

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;

import android.content.Context;
import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.Toast;

public class HttpTraitement extends AsyncTask<HttpClient, Integer, HttpResponse> {

    private Context context;

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

    @Override
    protected HttpResponse doInBackground(HttpClient... params) {
        // TODO Auto-generated method stub
        HttpResponse response = null;
        params[0] = new DefaultHttpClient();


        HttpPost httppost = new HttpPost("http://namedomain/test.php");


        try {
            response = params[0].execute(httppost); 

        } catch (ClientProtocolException e) {
            Toast.makeText(this.context, "Caught ClientProtocolException", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            Toast.makeText(this.context, "Caught IOException", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            Toast.makeText(this.context, "Exception", Toast.LENGTH_SHORT).show();                  
        }

        return response;

    }






}

LogCat スタック:

06-12 14:54:01.455: E/Trace(1244): error opening trace file: No such file or directory (2)
06-12 14:54:04.166: E/AndroidRuntime(1244): FATAL EXCEPTION: AsyncTask #1
06-12 14:54:04.166: E/AndroidRuntime(1244): java.lang.RuntimeException: An error occured while executing doInBackground()
06-12 14:54:04.166: E/AndroidRuntime(1244):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.lang.Thread.run(Thread.java:856)
06-12 14:54:04.166: E/AndroidRuntime(1244): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
06-12 14:54:04.166: E/AndroidRuntime(1244):     at com.example.testapp.HttpTraitement.doInBackground(HttpTraitement.java:29)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at com.example.testapp.HttpTraitement.doInBackground(HttpTraitement.java:1)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at 
android.os.AsyncTask$2.call(AsyncTask.java:287)
06-12 14:54:04.166: E/AndroidRuntime(1244):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)

================================================== =================

4

3 に答える 3

1

これは、非同期タスクを呼び出す方法だと思います。

HttpTraitement task = new HttpTraitement(this);
task.execute("http://namedomain/test.php");

そのためには、非同期タスクを次のように変更する必要があります。

public class HttpTraitement extends AsyncTask<String, Integer, HttpResponse> {

    private Context context;

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

    @Override
    protected HttpResponse doInBackground(String... params) {
        HttpResponse response = null;
        HttpPost httppost = new HttpPost(params[0]);

        try {
            HttpClient client = new DefaultHttpClient();
            response = client.execute(httppost); 

        } catch (ClientProtocolException e) {
            Toast.makeText(this.context, "Caught ClientProtocolException", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            Toast.makeText(this.context, "Caught IOException", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            Toast.makeText(this.context, "Exception", Toast.LENGTH_SHORT).show();                  
        }

        return response;

    }

}

execute()このメソッドは、非同期タスク オブジェクトごとに 1 回だけ呼び出す必要があることに注意してください。したがって、複数の URL に対して呼び出したい場合は、次のようにする必要があります。

HttpTraitement task1 = new HttpTraitement(this);
task1.execute("http://namedomain/test1.php");
HttpTraitement task2 = new HttpTraitement(this);
task2.execute("http://namedomain/test2.php");
于 2013-06-12T15:15:47.790 に答える
0

非同期タスクを呼び出すには、MainClass でクラス Httptraitement の新しいオブジェクトを作成する必要があります

HttpTraitement http=new HttpTraitement();

次に、asyncTask を実行する必要があり、params のパス、あなたの場合は HttpClient params;

HttpClient client= new DefaultHttpClient();
htt.execute(client);

あなたのログに:

 06-12 14:54:04.166: E/AndroidRuntime(1244): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
06-12 14:54:04.166: E/AndroidRuntime(1244):     at com.example.testapp.HttpTraitement.doInBackground(HttpTraitement.java:29)

つまり、単一のパラメーターを渡していないことを意味します...ここに行きます

于 2013-06-12T15:12:33.793 に答える