1

私は Android 開発の初心者で、これが初めてのアプリケーションです。

問題はおそらく非常に単純ですが、解決策が見つかりません。

このアプリケーションは単純な ImageViewer であり、アプリはサーバーに接続する必要があり、一部のデータに応じてサーバーは特定の画像を返します。その画像が画面に表示されます。クリックすると別の画像が表示されます。それだけです!

ご覧のとおり、UIThread から http ポスト クエリを実行することはできず、バックグラウンドで実行する必要があります。ただし、意図は、ユーザーが画像をクリックしたときです。

私は、作成時にアプリケーションがサーバーによって認識され、データを交換する AsyncTask を持っています。私m using a library SmartImageViewer (making possible load images from a url). At the moment in my code Iはカウンター++で画像をロードしていますが、これまでのところ機能しています。しかし、ユーザーがクリックして画面に表示するたびに画像の URL を取得する必要があります。

public class MainActivity extends Activity implements OnClickListener {
SmartImageView imageSwitcher;
String SERVER_IP;
String APP_ID;
String DEVICE_ID;
Integer counter = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    DB_Queries db = new DB_Queries(getApplicationContext());
    Cursor c = db.getServerIPAndAppId();
    StringBuilder app_id = new StringBuilder();
    StringBuilder server_ip = new StringBuilder();
    if (c.moveToFirst()) {
        do {
            server_ip.append(c.getString(c.getColumnIndex("server_ip")));
            app_id.append(c.getString(c.getColumnIndex("app_id")));
        } while (c.moveToNext());
    }
    db.close();

    SERVER_IP = server_ip.toString();
    APP_ID = app_id.toString();

    ServerConnect connect = new ServerConnect();
    connect.execute("http://" + server_ip + "/");

    SmartImageView image = (SmartImageView) this
            .findViewById(R.id.image_switcher);
    image.setImageUrl("http://localhost/public/albums/1/_(99).jpg");

    imageSwitcher = (SmartImageView) findViewById(R.id.image_switcher);
    imageSwitcher.setOnClickListener(this);

}

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

@Override
public void onClick(View v) {
    if (v.getId() == imageSwitcher.getId()) {
        counter++;
        Toast.makeText(getApplicationContext(), "Image is clicked",
                Toast.LENGTH_LONG).show();
        SmartImageView image = (SmartImageView) this
                .findViewById(R.id.image_switcher);
        image.setImageUrl("http://localhost/public/albums/1/_("
                + counter + ").jpg");
    }
}

private class ServerConnect extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... params) {
        String DEVICE_ID = Secure.getString(getContentResolver(),
                Secure.ANDROID_ID);
        DB_Queries db = new DB_Queries(getApplicationContext());
        Cursor c = db.getSettings();
        String APP_ID = null;
        String INSTALLED_AT = null;
        String TOKEN = null;
        if (c.moveToFirst()) {
            do {
                APP_ID = c.getString(c.getColumnIndex("app_id"));
                INSTALLED_AT = c
                        .getString(c.getColumnIndex("installed_at"));
                TOKEN = c.getString(c.getColumnIndex("token"));
            } while (c.moveToNext());
        }

        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(params[0]);
        post.addHeader("Content-type", "application/x-www-form-urlencoded");
        List<NameValuePair> pair = new ArrayList<NameValuePair>();
        pair.add(new BasicNameValuePair("device_id", DEVICE_ID));
        pair.add(new BasicNameValuePair("app_id", APP_ID.toString()));
        pair.add(new BasicNameValuePair("token", TOKEN.toString()));

        try {
            post.setEntity(new UrlEncodedFormEntity(pair));
            HttpResponse response = client.execute(post);
            InputStream is = response.getEntity().getContent();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            StringBuilder str = new StringBuilder();
            String chunk = null;

            while ((chunk = br.readLine()) != null) {
                str.append(chunk);
            }

            final String query_response = str.toString().trim();

            if (query_response.equals("HH@K2i")) {
                Cursor delete = db.updateAuth();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        db.close();

        return null;
    }

}

}

4

4 に答える 4

2

-UI work on UI threadとを守ることは常に良い習慣Non-UI work on Non-UI threadですが、Android 版Honey Combからはそれが法律になりました。

-でネットワーク処理作業を行うことができますbackground Non-UI thread

-このタスクを解決するために を使用するか、 として知られている android の PainLess Threading と呼ばれるものをThread使用しますHandlerAsyncTask

-は 、バックグラウンドの非 UI スレッドから UI スレッドに出力を配置するためにHandler一緒に使用されます。同様に、メソッドを使用してバックグラウンドで作業を行い、その出力をメソッドを介して UI スレッドにポストする場合にも使用されます 。ThreadAsyncTaskdoInBackground()onPostExecute()

例えば:

new AsyncTask<Params, Progress, Result>() {

            @Override
            protected Result doInBackground(Params... params) {

                                // --- Do your network task here

                return null;
            }

            protected void onPostExecute(Result result) {

                                // --- Show the output on UI thread from here

                       };
        };
于 2013-06-07T08:35:04.890 に答える
1

メイン UIthread でネットワーク操作を実行することは現在不可能です。HTTP リクエストを実行できるようにしたい場合は、別のスレッドを使用する必要があります。ラグナンダンが言ったように、これには asynctask を使用する必要があります

于 2013-06-07T08:26:13.980 に答える
0

そのような目的で WebImageView コンポーネントを使用することもできます。
ここにサンプルコードがあります(さまざまな場所から適応されています)
WebImageView >>
WebService >>

ここにサンプルプロジェクトがあります>>

于 2013-06-07T08:32:52.050 に答える
0

コードから、 onClick メソッドで既に新しい画像を設定しているようです。

サーバーから新しい URL を取得して画像を表示する場合は、asynctask を使用する必要があります。必要に応じて、既にあるものと同じものを使用できます。onclickから開始するだけです。

onClick(View v){
new MyAsynctask().execute();
}

Asynctasks には、doInbackground メソッドが実行された後に実行される onPostExecute メソッドがあります。onPostExecute は UI スレッドで実行されます。ここから新しいイメージを設定します。

doInBackground メソッドから、URL である文字列を返す必要があります。これは onPostExecute メソッドに渡されます。次に、image.setImageUrl(url); を実行します。

また、もう1つ、onClickで毎回ビューをバインドしています:

  SmartImageView image = (SmartImageView) this
                .findViewById(R.id.image_switcher);

これを oncreate で 1 回実行し、image をフィールドにします。その後、クラスのどこからでもイメージにアクセスできます。findViewById は高価な呼び出しであるため、一度だけ実行する必要があります。

于 2013-06-07T08:37:34.090 に答える