Open rainit2006 opened 7 years ago
问题记录
Android Studio找不到实际手机? 安装手机对应的安卓驱动。 比如我的是三星手机,从下面网站上安装android驱动即可。 https://developer.samsung.com/galaxy/others/android-usb-driver-for-windows
AVD创建时报错 “An error occurred while creating the AVD. See idea.log for details.” 看 C:\Users\User1.AndroidStudio2.3\system\log\idea.log 里写
............
17:06:04,335 [1140531] INFO - s.RepoProgressIndicatorAdapter - Parsing C:\Users\User1\AppData\Local\Android\Sdk\system-images\android-26\google_apis_playstore\x86\package.xml
2017-08-20 17:06:04,335 [1140531] INFO - s.RepoProgressIndicatorAdapter - Parsing C:\Users\User1\AppData\Local\Android\Sdk\tools\package.xml
2017-08-20 17:06:56,949 [1193145] WARN - vdmanager.AvdManagerConnection - Exception during AvdManager initialization: java.lang.NullPointerException
2017-08-20 17:06:56,949 [1193145] WARN - vdmanager.AvdManagerConnection - Exception during AvdManager initialization: java.lang.NullPointerException
2017-08-20 17:09:46,683 [1362879] INFO - tools.idea.ddms.adb.AdbService - Initializing adb using: C:\Users\User1\AppData\Local\Android\Sdk\platform-tools\adb.exe, client support = true
2017-08-20 17:09:50,988 [1367184] INFO - tools.idea.ddms.adb.AdbService - Successfully connected to adb
2017-08-20 17:11:54,396 [1490592] WARN - vdmanager.AvdManagerConnection - Exception during AvdManager initialization: java.lang.NullPointerException
..........
启动Android Studio时 显示 FileNotFoundException: Entry fileTemplates//code/Google Test Fixture SetUp Method.cc.ft not found in C:/Program Files/Android/Android Studio/lib/idea.jar
It turned out that I had installed the 64 bit version on a 32 bit machine. In my defense, there's a big green download button that says its for windows, it says nothing about 64/32 bit until you scroll waaaaay down the page.
手头电脑OS是32bit的,安装Android Studio官网显示的推荐版本默认是64bit。
所以需要卸载后重新安装32bit的Android Studio。注意:32bit的没有SDK,所以需要先安装64bit,然后保留SDK(通过重命名目录,以防止被卸载)后再安装32bit。
- 、「Your Android SDK is missing,out of date, or is missing templates. You can configure your SDK via Configure | Project Defaults | Project Structure | SDKs」とエラーが出てしまう。
これはAndroid SDKのインストールをしていないか、Android Studioにて設定をしていないかです。
- android studio build AVD unknown error
![image](https://user-images.githubusercontent.com/12871721/29721023-a1e348fa-89f6-11e7-8443-427e30a43278.png)
注意安装Google APIs Intel x86 Atom System Image。打开Android Studio时会提示要update Google APIs Intel x86 Atom System Image,点击update。
C# vs android
Rectangle vs Rect C# : Rectang (left, top, width, height) Android : Rect (left, top, right, down)
Draw a circle C#:
Bitmap bmp = new Bitmap(picBoard.Width, picBoard.Height);
Graphics g = Graphics.FromImage(bmp);
SolidBrush myBrush = new SolidBrush(Color.FromArgb(181, 181, 181));
for (int i = 0; i < gameSize; i++)
{
for (int j = 0; j < gameSize; j++)
{
Rectangle rect = new Rectangle((diameter + space) * j + w_Offset + (diameter / 2) * (i % 2), diameter * i + h_Offset, diameter, diameter);
g.FillEllipse(myBrush, rect);
}
}
picBoard.Image = bmp;
myBrush.Dispose();
g.Dispose();
Android:
SurfaceHolder mHolder;
mHolder = getHolder();
Canvas canvas = mHolder.lockCanvas();
Paint paint = new Paint();
paint.setColor(Color.argb(255, 181, 181, 181));
for (int i = 0; i < gameSize; i++)
{
for (int j = 0; j < gameSize; j++)
{
//Rect rect = new Rect((diameter + space) * j + w_Offset + (diameter / 2) * (i % 2), diameter * i + h_Offset, diameter, diameter);
//g.FillEllipse(myBrush, rect);
float x = (diameter + space) * j + w_Offset + (diameter / 2) * (i % 2) + (diameter / 2);
float y = diameter * i + h_Offset + (diameter / 2);
canvas.drawCircle(x, y, diameter/2, paint);
}
}
mHolder.unlockCanvasAndPost(mCanvas);
ArrayList C#:
ArrayList.Add();
ArrayList[index];
ArrayList[x, y] // get data from a two-dimension arraylist : ArrayList[5][4] ;
ArrayList.Count
Android:
ArrayList.add();
ArrayList.get(index);
ArrayList[i][j]
ArrayList.size()
Random C#
Next() : 0 以上のランダムな整数を返します。
Next(int) : 指定した最大値より小さい 0 以上のランダムな整数を返します。
Next(int, int) : 指定した範囲内のランダムな整数を返します。
Android:
//Randomクラスの生成
Random r = new Random();
//乱数の取得
int i = r.nextInt(50); //0~49の乱数を取得する
double d = r.nextDouble(); //0.0~1.0の乱数を取得する
boolean b = r.nextBoolean(); //true、falseいずれかを取得する
int i1 = r.nextInt(80 - 65) + 65; //between 65 (inclusive) and 80 (exclusive) like C# Random.next(65, 80)
Kotlin for Android
Android Kotlin 开发--偶遇Rxjava、Retrofit2进行网络请求 http://blog.csdn.net/wu996489865/article/details/72726177
Kotlin sample:「Dribbble」というデザインサイトのAPIを利用して簡単なアプリを作成する 残念ながら、Retrofit1を利用していたんだ。。 https://developers.eure.jp/android/advent-calendar-19/ https://github.com/TakuSemba/DribbbleKotlinApp
Kotlin
Java basic class Thread スレッドを作成するには、Thread のサブクラスを作成する方法と、Runnable インタフェースを実装したオブジェクトを用いる方法があります。
class ThreadTest {
public static void main(String[] args) {
ThreadTestThread tt = new ThreadTestThread();
tt.start();
for (int i = 0; i < 1000; i++) {
System.out.print('.');
}
}
}
class ThreadTestThread extends Thread { public void run() { for (int i = 0; i < 1000; i++) { System.out.print('o'); } } }
- ランナブル(Runnable)
class RunnableTest { public static void main(String[] args) { RunnableTestThread tt = new RunnableTestThread(); Thread t = new Thread(tt); t.start(); for (int i = 0; i < 1000; i++) { System.out.print('.'); } } }
class RunnableTestThread implements Runnable { public void run() { for (int i = 0; i < 1000; i++) { System.out.print('o'); } } }
ThreadとRunnableの違いについて(Java)
Javaでは1つのクラスに対し複数のインタフェースを実装することができますが、
クラスの多重継承はできません。
なので、スレッドを実装するクラスが別クラスを継承する(サブクラスである)必要がある場合には
Runnableインタフェースを使います。
===============================================
**Handler**
Handlerクラスはスレッド間通信のための仕組みである。もっと正確に言うと、Handlerインスタンスを生成したスレッドへイベントを送るための仕組みなのである。
よく書かれるソースは以下のような感じである。
Handler handler = new Handler(); // (1) handler.post(new Runnable() { @Override public void run() { // UI部品への操作; return; } });
このソースのポイントは(1)である。
(1)を実行したスレッドへHandler.post()で指定したRunnableが送られる。つまり、UIスレッドで(1)を実行すれば、UIスレッドへ送られ、別スレッドで(1)を実行すれば、別スレッドへ送られる。
AndroidのソースHandlerのコンストラクタのソースを見て、確認してみる。
ポイントは2点。ポイント(1)で呼び出しスレッドの宛先(Looper)を取り出し、ポイント(2)で宛先のポスト(mQueue)へRunnableを送りつけている。このソースを見るとよくわかるのだが、Handlerクラスは決してUIスレッドへRunnableを送りつけるためのものではない。Handlerインスタンスを生成したスレッドへイベントを送りつけるための仕組みである。
Runnableを送りつけたい宛先を明示したい場合は、もう一つのコンストラクタであるHandler(Looper looper)を使う。これを使えば、任意のThreadへRunnableを送りつけることができる。
この仕組みさえ知っていれば、任意のスレッドとの通信が可能となる。例えば、WebViewを使っている場合は、WebViewの本体であるWebViewCoreThreadと通信することが可能となる。
public class HogeTask extends Thread { public HogeTask() { }
public void execute(Looper toLooper, String data) {
// ここでスレッドでしたい処理を記述
new Handler(toLooper).post(new Runnable() {
public void run() {
// ここで宛先toLooperでしたい処理を記述
return;
}
});
}
}
呼び出し側はこんな感じかな。
`new HogeTask().execute(toLooper, "hogehage");`
toLooperには宛先スレッドのLooperを入れるとよい。Looperの取得の仕方は、対象となるスレッド上でLooper.myLooper()とすればよい。ちなみにUIスレッドのLooperを取得したい場合は、Looper.getMainLooper()を呼べばよい。
=======================
**Message**
Handlerはスレッドを超えてMessageクラスのオブジェクトを送受信することができる。
送信のメソッドは変更の必要がないので、受信を行うメソッドであるhandlerMessage(Message msg)のみoverrideする。
Handler handler = new Handler() {
@override
public void handleMessage(Message msg) {
switch(msg.what) {
case 1:
// msg.objはObject型なのでキャストする必要がある
Log.d("Handler", (String)msg.obj);
break;
default :
break;
}
}
MessageをTaskThreadからメインスレッドに送信する。
class TaskTread extends Thread { private Handler handler;
public TaskThread(Handler handler) {
this.handler = handler;
}
@override
public void run() {
//重たい処理
// ・・・
Message msg = Message.obtain();
// 実際にはマジックナンバーではなく値を決めておく
msg.what = 1;
// 結果がString型のcontentにあると仮定
msg.obj = content;
handler.sendMessage(msg);
}
}
Java Basic InputStream Class ・ByteArrayInputStream : byte型の配列を入力元とする.
// 処理対象のバイト配列。
byte[] bytes = new byte[]{ 1, 2, 3, -1 };
// そのバイト配列を読み込み対象とする
// ByteArrayInputStreamクラスを用意します。
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( bytes );
while( true )
{
// 1バイト取得します。
int i = byteArrayInputStream.read();
if( i == -1 )
{
// -1が返されてきたら終わりです。
break;
}
// 出力します。
System.out.println( "0x" + Integer.toHexString( i ) + " ( " + i + " )" );
}
// 0x1 ( 1 )
// 0x2 ( 2 )
// 0x3 ( 3 )
// 0xff ( 255 )
対になる出力側のクラスはByteArrayOutputStreamクラスである。
// ByteArrayOutputStreamクラスを用意します。
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// バイトデータを書き込みます。
byteArrayOutputStream.write( 0x01 );
byteArrayOutputStream.write( 0x02 );
byteArrayOutputStream.write( 0x03 );
byteArrayOutputStream.write( 0xFF );
byteArrayOutputStream.write( 0x100 );
// 書き込まれたバイトデータをbyte型配列として取得します。
byte[] bytes = byteArrayOutputStream.toByteArray();
for( int iF1 = 0; iF1 < bytes.length; ++iF1 )
{
// 出力します。
System.out.println( "0x" + Integer.toHexString( bytes[iF1] ) + " ( " + bytes[iF1] + " )" );
}
// 0x1 ( 1 )
// 0x2 ( 2 )
// 0x3 ( 3 )
// 0xffffffff ( -1 )
// 0x0 ( 0 )
・FileInputStream : ファイルを入力元とする.
// 入力ファイルの絶対パス。
String inputFilePath = "D:/from.txt";
// FileInputStreamクラスの参照型変数。
// ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。
FileInputStream fileInputStream = null;
try
{
// まずFileInputStreamクラスを作ります。
// このクラス経由でファイルから文字列を取得します。
fileInputStream = new FileInputStream( inputFilePath );
while( true )
{
// 1バイト取得します。
int i = fileInputStream.read();
if( i == -1 )
{
// -1が返されてきたら終わりです。
break;
}
// 出力します。
System.out.println( "0x" + Integer.toHexString( i ) + " ( " + i + " )" );
}
InputStream inputStream = socket.getInputStream();
// read from the stream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] content = new byte[ 2048 ];
int bytesRead = -1;
while( ( bytesRead = inputStream.read( content ) ) != -1 ) {
baos.write( content, 0, bytesRead );
} // while
资源: -《第一行代码》 https://github.com/ZSCDumin/AndroidDevelopmentSummary/blob/master/%E7%AC%AC%E4%B8%80%E8%A1%8C%E4%BB%A3%E7%A0%81%20Android%20%E7%AC%AC2%E7%89%88-%E9%83%AD%E9%9C%96-%E4%BA%BA%E9%82%AE-2016.12-P580.pdf
Android 书籍推荐(从入门到到放弃) https://www.jianshu.com/p/91987c0f6bdd
Kotlin https://zhuanlan.zhihu.com/p/27034675
Android ImageView Tutorial http://o7planning.org/en/10531/android-imageview-tutorial
SurfaceViewの基本 https://sites.google.com/a/gclue.jp/android-docs-2009/surfaceviewno-ji-ben